JavaRush /Java blogi /Random-UZ /Biz unga ma'mur sifatida ishlash qobiliyatini va statisti...

Biz unga ma'mur sifatida ishlash qobiliyatini va statistikani qo'shamiz - "A dan Zgacha Java loyihasi"

Guruhda nashr etilgan
Hammaga salom aziz do'stlarim. Shunday qilib, bot allaqachon ishlamoqda va yangi maqolalar haqida bildirishnomalar yubormoqda. Agar siz hali foydalanmayotgan bo'lsangiz, bu erda havola: Javarush Telegram Bot . Xo'sh, bugun biz faqat administratorlar uchun ishlaydigan buyruqlarni qo'shish haqida gaplashamiz. Ushbu buyruqlardan biri statistika va yordam panelidir. Bu nima uchun kerak? Ayni paytda bu vazifa doirasidagi asarni annotatsiyalar bilan tasvirlash unga bo‘lgan ehtiyojdan ko‘ra qiziqroq. "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish - 1Xo'sh, biz statistika guruhiga ketayotganimiz sababli, biz uni kengaytirib, uni yanada ma'lumotli qilishimiz mumkin. MVPdan so'ng, masalan, mualliflar uchun statistik ma'lumotlarni qaytarish mumkin bo'ladi. Ammo bu haqda keyinroq ...)

Keling, ular uchun administratorlar va buyruqlar qo'shishni tushunaylik

Biz ishimizni asosiy filialni yangilash va uning asosida yangisini yaratishdan boshlaymiz - STEP_9_JRTB-10. Qaysi buyruq administratorlarga va qaysi biri hammaga tegishli ekanligini aniqlash uchun siz jamoani belgilashingiz kerak. Buning uchun annotatsiya yaratamiz. Bu nima degani? Biz buni oldin qilmaganmiz. Bu IDEA-da sinf yaratishda tanlanishi mumkin. Men sizga hozir ko'rsataman. Buyruqlar to'plamida yangi izohlar to'plamini yarating va unda AdminCommand izohi: "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-2 qismIzohning o'zi quyidagicha bo'ladi:
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 {
}
Bu yerda bizga boshqa hech narsa kerak emas. Keyinchalik, biz uni StatCommand buyrug'imizga qo'shamiz: "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-3 qismEndi hamma narsa ishlashi kerak ... Yoki yo'qmi? Yo'q, albatta)) Biz CommandContainer-ni natijani to'g'ri ishlab chiqarishga o'rgatishimiz kerak. Buni amalga oshirish uchun, keling, retrieveCommand usulini yangilaymiz , bu unga uzatilgan narsaga qarab ishga tushirish uchun buyruq beradi. Biz uning Telegramdagi foydalanuvchi nomidan administrator identifikatori sifatida foydalanamiz. Bu chat_id-ga qaraganda noyob va o'qish osonroq. Uni qanday olish mumkin? U yangilash ob'ektida joylashgan bo'lib, u xabar bilan birga keladi:
update.getMessage().getFrom().getUserName()
Yuqoridagilarning barchasini umumlashtirib, keling, CommandContainer#retrieveCommand usulini yangilaymiz :
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));
}
Bu erda ko'rib turganingizdek, men berilgan buyruqda AdminCommand izohi mavjudligini tekshiradigan isAdminCommand usulini qo'shdim. Va agar bu faqat administrator buyrug'i bo'lsa, biz mavjud administratorlar to'plamida ushbu foydalanuvchi nomi bor yoki yo'qligini tekshiramiz. Aytgancha, mana, OOP, butun shon-shuhratda: biz shunchaki interfeysdan o'tamiz, bu har qanday dastur bo'lishi mumkin. Lekin biz faqat Buyruq interfeysini amalga oshiradigan sinfdan o'tishimiz mumkin . Va hamma narsa aniq ko'rinadi, faqat bitta narsadan tashqari: adminlar qayerdan kelgan? Men sizga hozir ko'rsataman. Hozircha men administratorlarni muhit o'zgaruvchisi sifatida o'tkazmoqchiman, shunda uni osongina sozlash mumkin. Bu o'zgaruvchi qatorni o'z ichiga oladi, unda administrator bo'ladigan telegram foydalanuvchilarining barcha foydalanuvchi nomlari vergul bilan ajratilgan holda ko'rsatilgan. Buning uchun application.properties ga qo'shing:
bot.admins: robeskman,romankh3
CommandContainer konstruktorida biz administratorlar to'plamini o'tkazamiz va uni ishga tushiramiz:
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;
Va allaqachon JavaRushTelegramBot-da xususiyatlar qatoridan to'plam olishning barcha sehrlari mavjud bo'ladi:
@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);
}
Yuqoridagi konstruktordan ko'rinib turibdiki, biz yana Value izohidan foydalanamiz , unga biz kollektsiyani yaratish mantiqini o'tkazamiz. Mana, administratorni qo'shish tugadi. Endi administrator bo'lmagan kishi bot statistikasi haqida ma'lumot olishni istasa, u quyidagi javobni oladi: Men sizni tushunmayapman 😟, nima tushunganimni bilish uchun yozing / yordam bering. Shunday qilib, biz bot buyruqlari uchun rollarni farqladik.

Administratorlar uchun yordam buyrug'ini qo'shish

Keyinchalik, ma'murlar uchun alohida yordam buyrug'ini yaratish mantiqan to'g'ri keladi . Kelajakda bu qism sezilarli darajada o'sishi mumkin. CommandName ga administrator yordam qiymatini qo'shing:
ADMIN_HELP("/ahelp")
Buyruqlar paketida AdminHelpCommand sinfini yarating :
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);
   }
}
Hozircha bu juda oddiy. Kelajakda u juda yaxshi o'sishi mumkin. Ushbu buyruq uchun shablonimizdan 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);
   }
}
Albatta, buyruqni xaritamizdagi CommandContainer-ga qo'shish kerak:
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

Botga buyruqlar tavsifini qo'shish

Telegram botlarining yana bir qiziqarli xususiyati bor: foydalanuvchiga buyruqlardan foydalanishni osonlashtirish uchun u qabul qilgan buyruqlarning qiymatlari va tavsiflarini qo‘shishingiz mumkin. Bu nimaga o'xshaydi? Misol uchun, keling, BotFather- ga boramiz - eng muhim Telegram bot. Agar siz chiziqcha / bilan xabar yozishni boshlasangiz, bot variantlarni taklif qiladi: "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-4 qismAgar yozishni davom ettirsangiz, u filtrlaydi va tegishli variantlarni ko'rsatadi: "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-5 qismAjoyib funksionallik, shunday emasmi? Shuning uchun men bu erda ham xuddi shunday qilishni xohlayman. Men buni eng yaxshi yo'l bilan qilaman - Telegram ilovasi orqali. Buni dasturiy tarzda amalga oshirish mumkinligini bilaman. Lekin qila olmayman. Ushbu maqolalar seriyasining maqsadlari uchun bu shart emas. Agar kimdir buni qanday qilishni bilsa, menga yozing, biz uni qo'shamiz. Men bu borada har qanday yordamni mamnuniyat bilan qabul qilaman. Men bir marta buni biz uchun ishlaydigan buyruq namunasi orqali amalga oshirish mumkinligini o'qidim. Endi men buni qanday qilishimni ko'rsataman: biz Telegramda BotFather-ni topishimiz kerak, biz sozlamoqchi bo'lgan botni tanlashimiz kerak. Keyin, botni tahrirlashni va buyruqlar bo'limini tanlang. Endi men Javarush uchun test botim misolida hamma narsani ko'rsataman. BotFather-da biz buyruq yozamiz: /mybots"A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-6 qism Keyin, bizga kerak bo'lgan botni tanlang, mening holimda u test_javarush_community_bot bo'ladi: "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-7 qismTugmalar ro'yxatidan ko'rib turganingizdek, bu erda siz tokenni ko'rishingiz, botni o'chirishingiz va uni o'tkazishingiz mumkin. yana kimdir. Biz botni tahrirlashdan manfaatdormiz, shuning uchun biz Botni tahrirlash-ni tanlaymiz : "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-8 qismVa bu erda biz buyruqlarni tahrirlash-ni tanlaymiz : "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-9 qismBiz faqat ma'lum bir formatda xabar berishimiz kerak va u buyruqlar sifatida yoziladi. Yoki ularning barchasini olib tashlamoqchi bo'lsak, /bo'sh yozing. Shu maqsadda men SET_UP_COMMANDS_BOT_FATHER loyihasining ildizida fayl yarataman , unda biror narsa yuz bersa, uni tiklash yoki yangilash oson bo'lishi uchun barcha buyruqlarimizni yozaman. SET_UP_COMMANDS_BOT_FATHER:
boshlash - bot bilan ishlashni boshlash/qayta tiklash stop - bot bilan ishlashni to'xtatish addGroupSub - maqolalar guruhiga obuna bo'lish deleteGroupSub - maqolalar guruhiga obunani bekor qilish listGroupSub - siz obuna bo'lgan guruhlar ro'yxati yordam - men bilan ishlashda yordam olish
Bu erda biz administrator buyruqlarini o'tkazmasligimiz aniq. Ular haqida faqat adminlar bilishi kerak. Keling, ushbu xabarni olib, BotFather-ga o'tkazamiz: "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-10-qismOdatdagidek, bu birinchi marta ishlamadi. Bir necha daqiqa o'ylagandan so'ng, men barcha buyruqlarni oldingidek CamelCase-da emas, balki kichik harflarda topshirdim va hammasi yaxshi bo'ldi. Biz faylimizni yangilaymiz: SET_UP_COMMANDS_BOT_FATHER:
boshlash - bot bilan ishlashni boshlash/tiklash stop - bot bilan ishlashni to'xtatish addgroupsub - maqolalar guruhiga obuna bo'lish deletegroupsub - maqolalar guruhiga obunani bekor qilish listgroupsub - obuna bo'lgan guruhlar ro'yxati yordam - men bilan ishlashda yordam olish
Endi siz bizning botimizga kirishingiz va buyruqlar avtomatik yuklanganligini ko'rishingiz mumkin: "A dan Zgacha Java loyihasi": Administrator sifatida ishlash qobiliyatini va unga statistikani qo'shish.  1-11-qismQarang, hozir qanchalik go'zal! Men ushbu maqola doirasida statistikaning funktsional imkoniyatlarini kengaytirmoqchi edim, ammo material allaqachon ma'no va mazmun jihatidan katta edi. Shuning uchun biz buni keyingi safarga qoldiramiz. Ya'ni, JRTB-10 ning vazifasi to'liq bajarilmagan: biz uni keyingi maqolada yakunlaymiz. Shu bilan birga, men allaqachon mavjud bo'lgan barcha o'zgarishlarni asosiy botga qo'shaman. Muallifni qo'llab-quvvatlamoqchimisiz, lekin qanday qilishni bilmayapsizmi? Bu juda oddiy - mening tg kanalimga , GitHub akkauntimga obuna bo'ling va ular haqida o'z fikringizni maqolalarda yozing. Bu fikr-mulohaza men uchun muhim, shuning uchun ular o'qiyotganini va ularga qiziqish bildirishini tushunaman.

xulosalar

Keling, bugun nimani boshdan kechirganimizni umumlashtiramiz:
  1. Biz o'z izohingizni qanday qo'shishni va undan jamoalardagi rollarni belgilash uchun marker sifatida qanday foydalanish mumkinligini muhokama qildik. Aytgancha, bu interfeys yordamida amalga oshirilishi mumkin edi. Xuddi shu tarzda, biz marker interfeysini yaratamiz va keyin kelgan ob'ekt ushbu interfeysni amalga oshiradimi yoki yo'qligini tekshiramiz.
  2. Administratorlar uchun Yordam buyrug'i qo'shildi. Menga kelsak, bu ham ushbu botni ishlab chiqishda muhim qismdir.
  3. Biz ularni botga yozishda buyruqlar tavsifi va qalqib chiquvchi oynasini qanday qo'shishni muhokama qildik. Qiziqarli xususiyat, albatta qo'shishga arziydi.
Ushbu maqolaga asoslanib, men yaratdim tortishish so'rovi , uning tafsilotlarini ko'rishingiz mumkin. E'tiboringiz uchun barchangizga rahmat, odatdagidek: layk - obuna bo'ling - qo'ng'iroq qiling , loyihamiz uchun yulduzcha qoldiring, maqolani sharhlang va baho bering! Keyingi maqolada ko'rishguncha!

Seriyadagi barcha materiallar ro'yxati ushbu maqolaning boshida.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION