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. Yaxşı, 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...)
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!
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ı: 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: İ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: Ə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: Ə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 Sonra bizə lazım olan botu seçin, mənim vəziyyətimdə test_javarush_community_bot olacaq: Dü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 : Və burada Edit Komandaları seçirik : Bizə 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: Adə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: Gö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:- 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.
- Adminlər üçün Yardım əmri əlavə edildi. Mənə gəlincə, bu da bu botun inkişafında vacib bir hissədir.
- 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.
GO TO FULL VERSION