JavaRush /وبلاگ جاوا /Random-FA /ما توانایی کار به عنوان مدیر و آمار را برای او اضافه می ک...
Roman Beekeeper
مرحله

ما توانایی کار به عنوان مدیر و آمار را برای او اضافه می کنیم - "پروژه جاوا از A تا Z"

در گروه منتشر شد
سلام به همه دوستان عزیزم. بنابراین، ربات در حال حاضر کار می کند و اعلان هایی در مورد مقالات جدید ارسال می کند. اگر هنوز از آن استفاده نکرده‌اید، این لینک است: ربات تلگرام Javarush . خوب، امروز ما در مورد اضافه کردن دستوراتی صحبت خواهیم کرد که فقط برای ادمین ها کار می کنند. یکی از این دستورات Statistics و Help Board است. چرا این لازم است؟ در حال حاضر، توصیف اثر با حاشیه‌نویسی در چارچوب این کار جالب‌تر از نیاز واقعی آن است. "پروژه جاوا از A تا Z": اضافه کردن قابلیت کار به عنوان مدیر و آمار برای او - 1خوب، از آنجایی که ما به تیم آمار می رویم، می توانیم آن را گسترش دهیم و آموزنده تر کنیم. پس از MVP، برای مثال، امکان بازگشت آمار برای نویسندگان وجود خواهد داشت. اما بعداً در مورد آن بیشتر ...)

بیایید اضافه کردن ادمین ها و دستورات برای آنها را درک کنیم

ما کار خود را با به روز رسانی شاخه اصلی و ایجاد شاخه جدید بر اساس آن - STEP_9_JRTB-10 آغاز می کنیم. برای اینکه بفهمید کدام دستور برای ادمین ها و کدام برای همه اعمال می شود، باید تیم را برچسب بزنید. برای انجام این کار، بیایید یک حاشیه نویسی ایجاد کنیم. چه مفهومی داره؟ ما قبلا این کار را انجام نداده ایم. این را می توان هنگام ایجاد یک کلاس در IDEA انتخاب کرد. الان بهت نشون میدم در بسته دستوری، یک بسته حاشیه نویسی جدید ایجاد کنید و در آن حاشیه نویسی AdminCommand: "پروژه جاوا از 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 خود اضافه می کنیم: "پروژه جاوا از A تا Z": افزودن قابلیت کار به عنوان ادمین و آمار برای او.  قسمت 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 استفاده می کنیم که منطق ایجاد مجموعه را به آن منتقل می کنیم. و تمام، بنابراین افزودن ادمین به پایان رسیده است. حالا وقتی یک غیر ادمین می‌خواهد داده‌های آمار ربات را دریافت کند، پاسخ زیر را دریافت می‌کند: من شما را درک نمی‌کنم 😟، بنویسید / کمک کنید تا بفهمم چه چیزی می‌فهمم. به این ترتیب ما نقش ها را برای دستورات ربات متمایز کردیم.

اضافه کردن دستور کمک برای ادمین ها

در مرحله بعد، منطقی است که یک دستور کمک جداگانه برای مدیران ایجاد کنید. در آینده، این بخش ممکن است رشد قابل توجهی داشته باشد. مقدار راهنمای مدیریت را به 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 برویم - مهمترین ربات تلگرام. اگر شروع به نوشتن یک پیام با علامت / کنید، ربات گزینه هایی را ارائه می دهد: "پروژه جاوا از A تا Z": افزودن قابلیت کار به عنوان ادمین و آمار برای او.  قسمت 1 - 4و اگر به نوشتن ادامه دهید، گزینه های مربوطه را فیلتر کرده و نشان می دهد: "پروژه جاوا از A تا Z": افزودن قابلیت کار به عنوان ادمین و آمار برای او.  قسمت 1 - 5عملکرد جالب، درست است؟ بنابراین من می خواهم همین کار را در اینجا انجام دهم. من این کار را به بهترین نحو انجام خواهم داد - از طریق برنامه تلگرام. می دانم که این کار را می توان به صورت برنامه ای انجام داد. اما من نمی توانم. این برای اهداف این سری مقالات ضروری نیست. اگر کسی می داند چگونه این کار را انجام دهد، برای من بنویسد، ما آن را اضافه می کنیم. من با کمال میل هر گونه کمکی را در این زمینه می پذیرم. من یک بار خواندم که این را می توان از طریق الگوی دستوری که برای ما کار می کند انجام داد. اکنون به شما نشان خواهم داد که چگونه می توانم این کار را انجام دهم: باید BotFather را در تلگرام پیدا کنیم، رباتی را که می خواهیم پیکربندی کنیم را انتخاب کنیم. در مرحله بعد، ویرایش ربات و بخش مربوط به دستورات را انتخاب کنید. اکنون همه چیز را با استفاده از نمونه ربات آزمایشی خود برای Javarush نشان خواهم داد. در BotFather دستور را می نویسیم: /mybots"پروژه جاوا از A تا Z": افزودن قابلیت کار به عنوان ادمین و آمار برای او.  قسمت 1 - 6 سپس، ربات مورد نیاز خود را انتخاب کنید، در مورد من test_javarush_community_bot خواهد بود: "پروژه جاوا از A تا Z": افزودن قابلیت کار به عنوان ادمین و آمار برای او.  قسمت 1 - 7همانطور که از لیست دکمه ها می بینید، در اینجا می توانید توکن را مشاهده کنید، ربات را حذف کنید و آن را به شخص دیگری ما علاقه مند به ویرایش ربات هستیم، بنابراین Edit Bot را انتخاب می کنیم : "پروژه جاوا از A تا Z": افزودن قابلیت کار به عنوان ادمین و آمار برای او.  قسمت 1 - 8و در اینجا Edit Commands را انتخاب می کنیم : "پروژه جاوا از A تا Z": افزودن قابلیت کار به عنوان ادمین و آمار برای او.  قسمت 1 - 9فقط باید یک پیام در قالب خاصی ارائه کنیم و به عنوان دستور ضبط می شود. یا اگر می خواهیم همه آنها را حذف کنیم، /empty را بنویسیم. برای این منظور، من یک فایل در ریشه پروژه SET_UP_COMMANDS_BOT_FATHER ایجاد می کنم که در آن تمام دستورات خود را می نویسم تا اگر اتفاقی افتاد، به راحتی بازیابی یا به روز رسانی شود. SET_UP_COMMANDS_BOT_FATHER:
شروع - شروع/بازیابی کار با ربات توقف - توقف کار با ربات addGroupSub - اشتراک در گروهی از مقالات deleteGroupSub - لغو اشتراک از گروهی از مقالات listGroupSub - فهرست گروه هایی که در آنها مشترک شده اید کمک - دریافت کمک برای کار با من
واضح است که ما دستورات ادمین را در اینجا حمل نمی کنیم. فقط مدیران باید در مورد آنها بدانند. بیایید این پیام را بگیریم و آن را به BotFather منتقل کنیم: "پروژه جاوا از A تا Z": افزودن قابلیت کار به عنوان ادمین و آمار برای او.  قسمت 1 - 10همانطور که معمولاً اتفاق می‌افتد، بار اول درست نشد. بعد از چند دقیقه فکر همه دستورات رو با حروف کوچک و نه مثل قبل CamelCase دادم و همه چیز خوب پیش رفت. ما در فایل خود به روز می کنیم: SET_UP_COMMANDS_BOT_FATHER:
شروع - شروع/بازیابی کار با توقف ربات - توقف کار با ربات addgroupsub - مشترک شدن در گروهی از مقاله‌ها deletegroupsub - لغو اشتراک از گروهی از مقالات listgroupsub - فهرست گروه‌هایی که در آنها مشترک شده‌اید کمک کنید - در کار با من کمک بگیرید
حالا می توانید به ربات ما بروید و ببینید که آیا دستورات به طور خودکار بارگذاری شده اند یا خیر: "پروژه جاوا از A تا Z": افزودن قابلیت کار به عنوان ادمین و آمار برای او.  قسمت 1 - 11ببینید الان چقدر زیباست! من همچنین می خواستم عملکرد آمار را در چارچوب این مقاله گسترش دهم ، اما مطالب قبلاً هم از نظر معنی و هم از نظر محتوا حجیم بود. بنابراین این کار را به دفعات بعدی موکول می کنیم. یعنی کار JRTB-10 به طور کامل انجام نشده است: ما آن را در مقاله بعدی تکمیل خواهیم کرد. در عین حال، تمام تغییراتی که از قبل وجود دارد را به ربات اصلی اضافه می کنم. می خواهید از نویسنده حمایت کنید، اما نمی دانید چگونه؟ این بسیار ساده است - در کانال tg من ، حساب GitHub من مشترک شوید و نظر خود را در مورد آنها در مقالات اینجا بنویسید. این بازخورد برای من مهم است، بنابراین می دانم که آنها خوانده شده و به آنها علاقه مند هستند.

نتیجه گیری

بیایید آنچه را که امروز پشت سر گذاشتیم خلاصه کنیم:
  1. ما درباره نحوه اضافه کردن حاشیه نویسی خود و نحوه استفاده از آن به عنوان نشانگر برای تعیین نقش ها در تیم ها بحث کردیم. به هر حال، این می تواند با استفاده از رابط انجام شود. به همین ترتیب، یک رابط نشانگر ایجاد می کنیم و سپس بررسی می کنیم که آیا شیئی که وارد می شود این رابط را پیاده سازی می کند یا خیر.
  2. دستور Help برای ادمین ها اضافه شد. همانطور که برای من، این نیز بخش مهمی در توسعه این ربات است.
  3. ما در مورد نحوه اضافه کردن توضیحات و بازشو دستورات هنگام نوشتن آنها در یک ربات بحث کردیم. ویژگی جالب، قطعا ارزش افزودن دارد.
بر اساس این مقاله، من یک درخواست کشش ایجاد کردم ، می توانید جزئیات آن را ببینید. از همه شما برای توجه شما متشکرم، طبق معمول: لایک - مشترک شدن - زنگ ، ستاره برای پروژه ما، نظر دادن و امتیاز دادن به مقاله! شما را در مقاله بعدی می بینیم!

فهرستی از تمام مواد این مجموعه در ابتدای این مقاله است.

نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION