JavaRush /Java Blogu /Random-AZ /Administrator kimi işləmək bacarığı və onun üçün statisti...
Roman Beekeeper
Səviyyə

Administrator kimi işləmək bacarığı və onun üçün statistika əlavə edirik - "A-dan Z-yə Java layihəsi"

Qrupda dərc edilmişdir
Hər kəsə salam əziz dostlarım. Belə ki, bot artıq işləyir və yeni məqalələrlə bağlı bildirişlər göndərir. Hələ istifadə etmirsinizsə, bu link: Javarush Telegram Botu . Yaxşı, bu gün yalnız adminlər üçün işləyən əmrlər əlavə etmək haqqında danışacağıq. Bu əmrlərdən biri statistika və yardım lövhəsidir. Bu niyə lazımdır? Hazırda bu vəzifə çərçivəsində əsəri annotasiyalarla təsvir etmək ona faktiki ehtiyacdan daha maraqlıdır. "A-dan Z-yə Java layihəsi": Administrator kimi işləmək bacarığının əlavə edilməsi və onun üçün statistika - 1Yaxşı, statistika komandasına getdiyimiz üçün onu genişləndirə və daha informativ edə bilərik. MVP-dən sonra, məsələn, müəlliflər üçün statistikanı qaytarmaq mümkün olacaq. Amma bu haqda daha sonra...)

Gəlin onlar üçün adminlər və əmrlər əlavə etməyi anlayaq

İşimizə əsas filialı yeniləmək və onun əsasında yenisini yaratmaqla başlayırıq - STEP_9_JRTB-10. Hansı əmrin adminlərə və hansının hər kəsə aid olduğunu anlamaq üçün komandanı etiketləməlisiniz. Bunun üçün annotasiya yaradaq. Bunun mənası nədi? Biz bunu əvvəllər etməmişik. Bu, IDEA-da sinif yaratarkən seçilə bilər. İndi sizə göstərəcəyəm. Komanda paketində yeni annotasiya paketi yaradın və onun içində AdminCommand annotasiyası: "A-dan Z-yə Java layihəsi": Admin kimi işləmək bacarığının əlavə edilməsi və onun üçün statistika.  1-2 hissəAnnotasiyanın özü belə olacaq:
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 {
}
Burada bizə başqa heç nə lazım deyil. Sonra onu StatCommand əmrimizə əlavə edirik: "A-dan Z-yə Java layihəsi": Admin kimi işləmək bacarığının əlavə edilməsi və onun üçün statistika.  1-3 hissəİndi hər şey işləməlidir... Yoxsa yox? Xeyr, əlbəttə)) Nəticəni düzgün çıxarmağı CommandContainer-ə öyrətməliyik. Bunu etmək üçün retrieveCommand metodunu yeniləyək , hansı ki, ona ötürüləndən asılı olaraq işləmək üçün əmr verir. Onun istifadəçi adından Telegram-da admin identifikatoru kimi istifadə edəcəyik. chat_id ilə müqayisədə unikal və oxumaq daha asandır. Necə əldə etmək olar? O, mesajla gələn Yeniləmə obyektindədir:
update.getMessage().getFrom().getUserName()
Yuxarıdakıların hamısını ümumiləşdirərək, CommandContainer#retrieveCommand metodunu yeniləyək :
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));
}
Burada gördüyünüz kimi, verilən əmrdə AdminCommand annotasiyasının olub-olmadığını yoxlayan isAdminCommand metodunu əlavə etdim. Bu, yalnız admin əmridirsə, mövcud adminlər kolleksiyamızda həmin istifadəçi adının olub-olmadığını yoxlayırıq. Yeri gəlmişkən, bu, OOP, bütün şöhrəti ilə: biz sadəcə olaraq hər hansı bir tətbiq ola biləcək bir interfeys keçirik. Lakin biz yalnız Command interfeysini həyata keçirən sinfi keçə bilərik . Və bir şey istisna olmaqla, hər şey aydın görünür: adminlər haradan gəldi? İndi sizə göstərəcəyəm. Hələlik mən idarəçiləri mühit dəyişəni kimi ötürmək istəyirəm ki, o, asanlıqla konfiqurasiya olunsun. Bu dəyişən inzibatçı olacaq teleqram istifadəçilərinin bütün istifadəçi adlarının vergüllə ayrıldığı sətirdən ibarət olacaq. Bunu etmək üçün application.properties-ə əlavə edin:
bot.admins: robeskman,romankh3
CommandContainer konstruktorunda adminlər toplusunu keçəcəyik və onu işə salacağıq:
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ə artıq JavaRushTelegramBot-da xassələrdə sətirdən kolleksiya əldə etməyin bütün sehrləri olacaq:
@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);
}
Yuxarıdakı konstruktordan göründüyü kimi, biz kolleksiya yaratmaq üçün məntiqi daxil etdiyimiz dəyər annotasiyasından yenidən istifadə edirik. Və budur, admini əlavə etmək bitdi. İndi admin olmayan şəxs botun statistikası haqqında məlumat əldə etmək istəyəndə o, belə cavab alacaq: Mən sizi başa düşmürəm 😟, nə başa düşdüyümü öyrənmək üçün yazın / kömək edin. Bu yolla biz bot əmrləri üçün rolları fərqləndirdik.

Adminlər üçün yardım əmrinin əlavə edilməsi

Bundan sonra, idarəçilər üçün ayrıca yardım əmri yaratmaq məntiqli olardı . Gələcəkdə bu hissə əhəmiyyətli dərəcədə arta bilər. Admin yardım dəyərini CommandName-ə əlavə edin:
ADMIN_HELP("/ahelp")
Komanda paketində AdminHelpCommand sinifini yaradın :
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);
   }
}
Bu günə qədər çox sadədir. Gələcəkdə yaxşı inkişaf edə bilər. Bu əmr üçün şablonumuzdan bir test:
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);
   }
}
Əlbəttə ki, komanda xəritəmizdəki CommandContainer-ə əlavə edilməlidir:
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

Bota əmrlərin təsvirinin əlavə edilməsi

Telegram botlarının daha bir maraqlı xüsusiyyəti var: istifadəçinin əmrlərdən istifadəsini asanlaşdırmaq üçün onun qəbul etdiyi əmrlərin dəyərlərini və təsvirlərini əlavə edə bilərsiniz. Nə kimi görünür? Məsələn, ən vacib Telegram botu olan BotFather- ə gedək. Əgər siz / işarəsi ilə mesaj yazmağa başlasanız, bot seçimlər təklif edəcək: "A-dan Z-yə Java layihəsi": Admin kimi işləmək bacarığının əlavə edilməsi və onun üçün statistika.  1-4 hissəƏgər yazmağa davam etsəniz, o, müvafiq variantları süzgəcdən keçirəcək və göstərəcək: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 5Əla funksionallıq, elə deyilmi? Ona görə də burada da eyni şeyi etmək istəyirəm. Mən bunu bacardığım qədər edəcəm - Telegram tətbiqi vasitəsilə. Bilirəm ki, bunu proqramlı şəkildə etmək olar. Amma mən bacarmıram. Bu məqalələr seriyasının məqsədləri üçün bu lazım deyil. Bunu necə edəcəyini bilən varsa mənə yazsın, əlavə edəcəyik. Bununla bağlı istənilən yardımı məmnuniyyətlə qəbul edəcəm. Bir dəfə oxudum ki, bu, bizim üçün işləyən əmr nümunəsi vasitəsilə edilə bilər. İndi mən sizə bunu necə edə biləcəyimi göstərəcəyəm: biz Telegram-da BotFather-i tapmalıyıq, konfiqurasiya etmək istədiyimiz botu seçməliyik. Sonra, botun redaktə edilməsini və əmrlər haqqında bölməni seçin. İndi Javarush üçün test botumun nümunəsindən istifadə edərək hər şeyi göstərəcəyəm. BotFather-də biz aşağıdakı əmri yazırıq: /mybots"Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 6 Sonra bizə lazım olan botu seçin, mənim vəziyyətimdə test_javarush_community_bot olacaq: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 7Düymələr siyahısından da göründüyü kimi, burada işarəyə baxa, botu silə və onu köçürə bilərsiniz. başqa kimsə. Biz botu redaktə etməkdə maraqlıyıq, ona görə də biz Botu Edit seçirik : "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 8Və burada Edit Komandaları seçirik : "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 9Bizə sadəcə olaraq konkret formatda mesaj təqdim etməliyik və o, əmrlər kimi qeyd olunacaq. Və ya hamısını silmək istəyiriksə, /boş yazın. Bu məqsədlə SET_UP_COMMANDS_BOT_FATHER layihəsinin kökündə bir fayl yaradacağam və orada bütün əmrlərimizi yazacağam ki, nəsə baş verərsə, onu bərpa etmək və ya yeniləmək asan olsun. SET_UP_COMMANDS_BOT_FATHER:
başlamaq - botla işə başlamaq/bərpa etmək stop - botla işi dayandırmaq addGroupSub - məqalələr qrupuna abunə ol deleteGroupSub - məqalələr qrupuna abunə ol listGroupSub - abunə olduğunuz qrupların siyahısı yardım - mənimlə işləmək üçün kömək alın
Aydındır ki, biz burada admin əmrləri daşımırıq. Onlar haqqında yalnız adminlər bilməlidir. Gəlin bu mesajı götürək və onu BotFather-ə ötürək: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 10Adətən olduğu kimi, ilk dəfə alınmadı. Bir neçə dəqiqəlik fikirləşdikdən sonra bütün əmrləri əvvəlki kimi CamelCase-də deyil, kiçik hərflərlə keçdim və hər şey yaxşı keçdi. Faylımızda yeniləyirik: SET_UP_COMMANDS_BOT_FATHER:
başlamaq - botla işə başlamaq/bərpa etmək stop - botla işi dayandırmaq addgroupsub - məqalələr qrupuna abunə olmaq deletegroupsub - məqalələr qrupuna abunə olmaq listgroupsub - abunə olduğunuz qrupların siyahısı yardım - mənimlə işləmək üçün kömək alın
İndi siz botumuza daxil olub əmrlərin avtomatik yüklənib-yüklənilmədiyini görə bilərsiniz: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 11Görün indi necə gözəldir! Mən də bu məqalə çərçivəsində statistikanın funksionallığını genişləndirmək istədim, lakin material həm məna, həm də məzmun baxımından artıq həcmli idi. Ona görə də bunu növbəti dəfə təxirə salacağıq. Yəni JRTB-10-un tapşırığı tam yerinə yetirilməyib: onu növbəti məqalədə tamamlayacağıq. Eyni zamanda, artıq mövcud olan bütün dəyişiklikləri əsas bota əlavə edəcəyəm. Müəllifə dəstək olmaq istəyirsiniz, amma necə olduğunu bilmirsiniz? Çox sadədir - mənim tg kanalıma , GitHub hesabıma abunə olun və buradakı məqalələrdə onlar haqqında fikrinizi yazın. Bu rəy mənim üçün vacibdir, ona görə də başa düşürəm ki, onlar oxuyurlar və onlarla maraqlanırlar.

nəticələr

Bu gün yaşadıqlarımızı ümumiləşdirək:
  1. Biz öz annotasiyanızı necə əlavə edəcəyinizi və ondan komandalardakı rolları müəyyən etmək üçün marker kimi necə istifadə olunacağını müzakirə etdik. Yeri gəlmişkən, bu, interfeysdən istifadə etməklə edilə bilərdi. Eyni şəkildə, bir marker interfeysi yaradacaq və sonra gələn obyektin bu interfeysi tətbiq edib-etmədiyini yoxlayacağıq.
  2. Adminlər üçün Yardım əmri əlavə edildi. Mənə gəlincə, bu da bu botun inkişafında vacib bir hissədir.
  3. Biz onları botda yazarkən əmrlərin təsvirini və pop-upunu necə əlavə etməyi müzakirə etdik. Maraqlı xüsusiyyət, mütləq əlavə etməyə dəyər.
Bu məqaləyə əsaslanaraq mən çəkmə sorğusu yaratdım , onun təfərrüatlarını görə bilərsiniz. Diqqətiniz üçün hamınıza təşəkkür edirəm, həmişəki kimi: bəyənin - abunə olun - zəng edin , layihəmiz üçün ulduz verin, məqaləni şərh edin və qiymətləndirin! Növbəti məqalədə görüşənədək!

Serialdakı bütün materialların siyahısı bu məqalənin əvvəlindədir.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION