JavaRush /בלוג Java /Random-HE /אנו מוסיפים את היכולת לעבוד כמנהל וסטטיסטיקה עבורו - "פרו...
Roman Beekeeper
רָמָה

אנו מוסיפים את היכולת לעבוד כמנהל וסטטיסטיקה עבורו - "פרויקט ג'אווה מא' עד ת'"

פורסם בקבוצה
שלום לכולם, חברים יקרים שלי. אז, הבוט כבר עובד ושולח הודעות על מאמרים חדשים. אם אינך משתמש בו עדיין, הנה הקישור: Javarush Telegram Bot . ובכן, היום נדבר על הוספת פקודות שעובדות רק עבור מנהלי מערכת. אחת הפקודות הללו היא סטטיסטיקה ולוח עזרה. למה זה נחוץ? כרגע מעניין יותר לתאר את העבודה עם ביאורים במסגרת המשימה הזו מאשר את הצורך בפועל בה. "פרויקט ג'אווה מא' עד ת': הוספת יכולת עבודה כמנהל וסטטיסטיקה עבורו - 1ובכן, מכיוון שאנו הולכים לצוות הסטטיסטיקה, נוכל להרחיב אותו ולהפוך אותו לאינפורמטיבי יותר. לאחר ה-MVP, ניתן יהיה להחזיר סטטיסטיקות עבור מחברים, למשל. אבל על כך בהמשך...)

בואו נבין הוספת מנהלים ופקודות עבורם

אנו מתחילים את עבודתנו על ידי עדכון הסניף הראשי ויצירת אחד חדש המבוסס עליו - STEP_9_JRTB-10. כדי להבין איזו פקודה חלה על מנהלי מערכת ואיזו חלה על כולם, עליך לסמן את הצוות. לשם כך, בואו ניצור הערה. מה זה אומר? לא עשינו את זה בעבר. ניתן לבחור זאת בעת יצירת מחלקה ב-IDEA. אני אראה לך עכשיו. בחבילת הפקודה, צור חבילת הערות חדשה ובתוכה הערת AdminCommand: "פרויקט ג'אווה מא' עד ת'": הוספת יכולת עבודה כמנהל וסטטיסטיקה עבורו.  חלק 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 שלנו: "פרויקט ג'אווה מא' עד ת'": הוספת יכולת עבודה כמנהל וסטטיסטיקה עבורו.  חלק 1 - 3עכשיו הכל אמור לעבוד... או לא? לא, כמובן)) אנחנו צריכים ללמד את CommandContainer שלנו לייצר נכון את התוצאה. לשם כך, בואו נעדכן את שיטת retrieveCommand , המוציאה פקודה להפעלה בהתאם למה שמועבר אליה. נשתמש בשם המשתמש שלו בטלגרם כמזהה המנהל. זה ייחודי וקל יותר לקריאה מאשר 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 . ונראה שהכל ברור, חוץ מדבר אחד: מאיפה הגיעו המנהלים? אני אראה לך עכשיו. לעת עתה אני רוצה להעביר אדמינים כמשתנה סביבה כך שניתן יהיה להגדיר אותו בקלות. משתנה זה יכיל שורה בה יצוינו כל שמות המשתמש של משתמשי טלגרם שיהיו מנהלי מערכת, מופרדים בפסיקים. כדי לעשות זאת, הוסף ל- 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))

הוספת תיאור של פקודות לבוט

לבוטים של טלגרם יש תכונה מעניינת נוספת: אתה יכול להוסיף ערכים ותיאורים של הפקודות שהוא מקבל כדי להקל על המשתמש להשתמש בפקודות. כמו מה זה נראה? לדוגמא, בוא נלך ל- BotFather - הבוט החשוב ביותר של טלגרם. אם תתחיל לכתוב הודעה עם סלאש /, הבוט יציע אפשרויות: "פרויקט ג'אווה מא' עד ת'": הוספת יכולת עבודה כמנהל וסטטיסטיקה עבורו.  חלק 1 - 4ואם תמשיך לכתוב, הוא יסנן ויציג אפשרויות רלוונטיות: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 5פונקציונליות מגניבה, נכון? אז אני רוצה לעשות את אותו הדבר כאן. אני אעשה את זה הכי טוב שאני יכול - דרך אפליקציית טלגרם. אני יודע שאפשר לעשות את זה בצורה תוכנית. אבל אני לא יכול. זה לא הכרחי למטרות סדרת מאמרים זו. אם מישהו יודע איך לעשות את זה, כתבו לי, נוסיף את זה. אשמח לקבל כל עזרה בנושא. פעם קראתי שאפשר לעשות את זה דרך תבנית הפקודה שמתאימה לנו. עכשיו אני אראה לך איך אני יכול לעשות את זה: אנחנו צריכים למצוא את 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 - רשימת הקבוצות שאליהן אתה מנוי עזרה - קבל עזרה בעבודה איתי
ברור שאנחנו לא נושאים כאן פקודות אדמין. רק מנהלים צריכים לדעת עליהם. בואו ניקח את המסר הזה ונעביר אותו ל-BotFather: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 10כפי שקורה בדרך כלל, זה לא הסתדר בפעם הראשונה. לאחר כמה דקות של מחשבה, העברתי את כל הפקודות באותיות קטנות, ולא ב-CamelCase כמו קודם, והכל הלך כשורה. אנו מעדכנים בקובץ שלנו: SET_UP_COMMANDS_BOT_FATHER:
התחל - התחל/שחזר עבודה עם הבוט עצור - הפסקת עבודה עם הבוט addgroupsub - הירשם לקבוצת מאמרים deletegroupsub - בטל את הרישום מקבוצת מאמרים listgroupsub - רשימת הקבוצות שאליהן אתה מנוי עזרה - קבל עזרה בעבודה איתי
עכשיו אתה יכול ללכת לבוט שלנו ולראות אם הפקודות נטענו אוטומטית: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 11תראה כמה זה יפה עכשיו! רציתי גם להרחיב את הפונקציונליות של סטטיסטיקה במסגרת מאמר זה, אבל החומר כבר היה רב עוצמה הן במשמעות והן בתוכן. לכן, נדחה זאת לפעם הבאה. כלומר, המשימה של JRTB-10 לא הושלמה לחלוטין: נשלים אותה במאמר הבא. במקביל, אוסיף את כל השינויים שכבר קיימים לבוט הראשי. רוצה לתמוך בכותב, אבל לא יודע איך? זה מאוד פשוט - הירשמו לערוץ tg שלי , לחשבון GitHub שלי וכתבו את דעתכם עליהם במאמרים כאן. המשוב הזה חשוב לי, אז אני מבין שהם נקראים ומתעניינים בהם.

מסקנות

בואו נסכם את מה שעברנו היום:
  1. דנו כיצד להוסיף הערה משלך וכיצד ניתן להשתמש בה כסמן כדי לתחום תפקידים בצוותים. אגב, ניתן היה לעשות זאת באמצעות הממשק. באותו אופן, היינו יוצרים ממשק סמן ואז בודקים אם האובייקט שמגיע מיישם את הממשק הזה או לא.
  2. נוספה פקודת עזרה למנהלים. מבחינתי, זה גם חלק חשוב בפיתוח הבוט הזה.
  3. דנו כיצד להוסיף תיאור וחלון קופץ של פקודות בעת כתיבתן בבוט. תכונה מעניינת, בהחלט שווה להוסיף.
בהתבסס על מאמר זה, יצרתי בקשת משיכה , אתה יכול לראות את הפרטים שלה. תודה לכולכם על תשומת הלב, כרגיל: לייק - הירשם - פעמון , כוכב על הפרויקט שלנו, הגיבו ודירגו את המאמר! נתראה בכתבה הבאה!

רשימה של כל החומרים בסדרה נמצאת בתחילת מאמר זה.

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION