JavaRush /Java Blog /Random-TL /Nagdagdag kami ng kakayahang magtrabaho bilang isang admi...

Nagdagdag kami ng kakayahang magtrabaho bilang isang administrator at mga istatistika para sa kanya - "Proyekto ng Java mula A hanggang Z"

Nai-publish sa grupo
Kumusta sa lahat, mahal kong mga kaibigan. Kaya, gumagana na ang bot at nagpapadala ng mga abiso tungkol sa mga bagong artikulo. Kung hindi mo pa ito ginagamit, narito ang link: Javarush Telegram Bot . Well, ngayon ay pag-uusapan natin ang pagdaragdag ng mga utos na gumagana lamang para sa mga admin. Isa sa mga utos na ito ay ang mga istatistika at help board. Bakit kailangan ito? Sa ngayon, mas kawili-wiling ilarawan ang gawain na may mga anotasyon sa loob ng balangkas ng gawaing ito kaysa sa aktwal na pangangailangan para dito. "Proyekto ng Java mula A hanggang Z": Pagdaragdag ng kakayahang magtrabaho bilang isang administrator at mga istatistika para sa kanya - 1Well, dahil pupunta kami sa pangkat ng istatistika, maaari naming palawakin ito at gawin itong mas nagbibigay-kaalaman. Pagkatapos ng MVP, posibleng ibalik ang mga istatistika para sa mga may-akda, halimbawa. Ngunit higit pa sa na mamaya ...)

Unawain natin ang pagdaragdag ng mga admin at utos para sa kanila

Sinisimulan namin ang aming trabaho sa pamamagitan ng pag-update sa pangunahing sangay at paglikha ng bago batay dito - STEP_9_JRTB-10. Para malaman kung aling command ang nalalapat sa mga admin at alin ang nalalapat sa lahat, kailangan mong lagyan ng label ang team. Para magawa ito, gumawa tayo ng anotasyon. Ano ang ibig sabihin nito? Hindi pa namin nagagawa ito dati. Maaari itong mapili kapag gumagawa ng klase sa IDEA. Ipapakita ko sa iyo ngayon. Sa command package, lumikha ng bagong annotation package at sa loob nito ang AdminCommand annotation: "Java project mula A hanggang Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 2Ang anotasyon mismo ay magiging ganito:
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 {
}
Wala na tayong kailangan dito. Susunod, idinagdag namin ito sa aming utos ng StatCommand: "Java project from A to Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 3Ngayon dapat gumana ang lahat... O hindi? Hindi, siyempre)) Kailangan nating turuan ang ating CommandContainer na gawin nang tama ang resulta. Para magawa ito, i-update natin ang retrieveCommand method , na naglalabas ng command na tatakbo depende sa kung ano ang ipinasa dito. Gagamitin namin ang kanyang username sa Telegram bilang admin identifier. Ito ay natatangi at mas madaling basahin kaysa sa chat_id. Paano ito makukuha? Ito ay nasa bagay na I-update, na kasama ng mensahe:
update.getMessage().getFrom().getUserName()
Binubuod ang lahat ng nasa itaas, i-update natin ang paraan ng 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));
}
Tulad ng nakikita mo dito, idinagdag ko ang isAdminCommand method , na nagsusuri kung mayroong AdminCommand annotation sa ibinigay na command. At kung ito ay isang admin-only na command, tinitingnan namin kung mayroon kaming username na iyon sa aming koleksyon ng mga available na admin. Sa pamamagitan ng paraan, narito ito, OOP, sa lahat ng kaluwalhatian nito: ipinapasa lang namin ang isang interface, na maaaring maging anumang pagpapatupad. Ngunit maaari lamang nating ipasa ang klase na nagpapatupad ng Command interface . At tila malinaw ang lahat, maliban sa isang bagay: saan nanggaling ang mga admin? Ipapakita ko sa iyo ngayon. Sa ngayon, gusto kong ipasa ang mga admin bilang environment variable para madali itong mai-configure. Ang variable na ito ay maglalaman ng isang linya kung saan ang lahat ng mga username ng mga gumagamit ng telegrama na magiging mga administrator ay ipinahiwatig, na pinaghihiwalay ng mga kuwit. Upang gawin ito, idagdag sa application.properties:
bot.admins: robeskman,romankh3
Sa CommandContainer constructor, ipapasa namin ang koleksyon ng mga admin at sisimulan ito:
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;
At nasa JavaRushTelegramBot na ang lahat ng mahika ng pagkuha ng isang koleksyon mula sa isang string sa mga katangian:
@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);
}
Gaya ng nakikita mo mula sa constructor sa itaas, muli naming ginagamit ang Value annotation , kung saan ipinapasa namin ang logic para sa paglikha ng koleksyon. At iyon nga, tapos na ang pagdaragdag ng admin. Ngayon, kapag gusto ng isang hindi admin na makakuha ng data sa mga istatistika ng bot, matatanggap niya ang sumusunod na sagot: Hindi kita maintindihan 😟, sumulat / tumulong upang malaman kung ano ang naiintindihan ko. Sa ganitong paraan, pinag-iba namin ang mga tungkulin para sa mga utos ng bot.

Pagdaragdag ng help command para sa mga admin

Susunod, magiging lohikal na lumikha ng isang hiwalay na command ng tulong para sa mga administrator. Sa hinaharap, ang bahaging ito ay maaaring lumago nang malaki. Idagdag ang halaga ng tulong ng admin sa CommandName:
ADMIN_HELP("/ahelp")
Lumikha ng klase ng AdminHelpCommand sa command package:
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);
   }
}
Sa ngayon ito ay napaka-simple. Maaari itong lumago nang maayos sa hinaharap. Para sa utos na ito, isang pagsubok mula sa aming template:
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);
   }
}
Siyempre, kailangang idagdag ang command sa CommandContainer sa aming mapa:
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

Pagdaragdag ng paglalarawan ng mga utos sa bot

Ang mga bot ng Telegram ay may isa pang kawili-wiling tampok: maaari kang magdagdag ng mga halaga at paglalarawan ng mga utos na tinatanggap nito upang gawing mas madali para sa gumagamit na gamitin ang mga utos. Anong itsura? Para sa isang halimbawa, pumunta tayo sa BotFather - ang pinakamahalagang Telegram bot. Kung magsisimula kang magsulat ng mensahe na may slash /, ang bot ay mag-aalok ng mga opsyon: "Java project mula A hanggang Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 4At kung magpapatuloy ka sa pagsusulat, ito ay mag-filter at magpapakita ng mga nauugnay na opsyon: "Java project from A to Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 5Cool na functionality, tama ba? Kaya gusto kong gawin din dito. Gagawin ko ito sa pinakamahusay na paraan na magagawa ko - sa pamamagitan ng Telegram application. Alam kong magagawa ito sa programmatically. Pero hindi ko makakaya. Ito ay hindi kinakailangan para sa mga layunin ng seryeng ito ng mga artikulo. Kung may nakakaalam kung paano gawin ito, sumulat sa akin, idagdag namin ito. Malugod kong tatanggapin ang anumang tulong dito. Minsan kong nabasa na ito ay maaaring gawin sa pamamagitan ng command pattern na gumagana para sa amin. Ngayon ipapakita ko sa iyo kung paano ko ito magagawa: kailangan nating hanapin ang BotFather sa Telegram, piliin ang bot na gusto nating i-configure. Susunod, piliin ang pag-edit ng bot at ang seksyon tungkol sa mga utos. Ngayon ay ipapakita ko ang lahat gamit ang halimbawa ng aking test bot para sa Javarush. Sa BotFather isinusulat namin ang utos: /mybots"Java project from A to Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 6 Susunod, piliin ang bot na kailangan namin, sa aking kaso ito ay test_javarush_community_bot: "Java project mula A hanggang Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 7Tulad ng nakikita mo mula sa listahan ng mga pindutan, dito maaari mong tingnan ang token, tanggalin ang bot, at ilipat ito sa ibang tao. Interesado kaming i-edit ang bot, kaya pipiliin namin ang Edit Bot : "Java project mula A hanggang Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 8At dito pipiliin namin ang Edit Commands : "Java project mula A hanggang Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 9Kailangan lang naming magbigay ng mensahe sa isang partikular na format, at ito ay ire-record bilang mga command. O kung gusto nating alisin lahat, isulat ang /empty. Para sa layuning ito, gagawa ako ng isang file sa ugat ng proyekto SET_UP_COMMANDS_BOT_FATHER , kung saan isusulat ko ang lahat ng aming mga utos upang madaling ibalik o i-update kung may nangyari. SET_UP_COMMANDS_BOT_FATHER:
simulan - simulan/ibalik ang trabaho gamit ang bot stop - i-pause ang trabaho gamit ang bot addGroupSub - mag-subscribe sa isang pangkat ng mga artikulo deleteGroupSub - mag-unsubscribe mula sa isang pangkat ng mga artikulo listGroupSub - listahan ng mga grupo kung saan ka naka-subscribe tulong - humingi ng tulong sa pagtatrabaho sa akin
Malinaw na hindi kami nagdadala ng mga utos ng admin dito. Mga admin lang dapat ang nakakaalam tungkol sa kanila. Kunin natin ang mensaheng ito at ipasa ito sa BotFather: "Java project from A to Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 10Gaya ng karaniwang nangyayari, hindi ito gumana sa unang pagkakataon. Pagkatapos ng ilang minutong pag-iisip, ipinasa ko ang lahat ng command sa lower case, at hindi sa CamelCase gaya ng dati, at naging maayos ang lahat. Nag-update kami sa aming file: SET_UP_COMMANDS_BOT_FATHER:
simulan - simulan/ibalik ang trabaho gamit ang bot stop - i-pause ang trabaho gamit ang bot addgroupsub - mag-subscribe sa isang pangkat ng mga artikulo deletegroupsub - mag-unsubscribe mula sa isang pangkat ng mga artikulo listgroupsub - listahan ng mga grupo kung saan ka naka-subscribe tulong - humingi ng tulong sa pagtatrabaho sa akin
Ngayon ay maaari kang pumunta sa aming bot at tingnan kung ang mga utos ay awtomatikong na-load: "Java project mula A hanggang Z": Pagdaragdag ng kakayahang magtrabaho bilang admin at mga istatistika para sa kanya.  Bahagi 1 - 11Tingnan kung gaano ito kaganda ngayon! Nais ko ring palawakin ang pag-andar ng mga istatistika sa loob ng balangkas ng artikulong ito, ngunit ang materyal ay napakalaki na pareho sa kahulugan at sa nilalaman. Samakatuwid, ipagpaliban natin ito para sa susunod na pagkakataon. Iyon ay, ang gawain ng JRTB-10 ay hindi ganap na tapos na: kukumpletuhin natin ito sa susunod na artikulo. Kasabay nito, idaragdag ko ang lahat ng mga pagbabago na mayroon na sa pangunahing bot. Gusto mong suportahan ang may-akda, ngunit hindi mo alam kung paano? Ito ay napaka-simple - mag-subscribe sa aking tg channel , ang aking GitHub account at isulat ang iyong opinyon tungkol sa mga ito sa mga artikulo dito. Ang feedback na ito ay mahalaga sa akin, kaya naiintindihan ko na sila ay nabasa at interesado sa kanila.

mga konklusyon

Isa-isahin natin ang mga pinagdaanan natin ngayon:
  1. Tinalakay namin kung paano magdagdag ng sarili mong anotasyon at kung paano ito magagamit bilang marker para ilarawan ang mga tungkulin sa mga team. Sa pamamagitan ng paraan, ito ay maaaring gawin gamit ang interface. Sa parehong paraan, gagawa kami ng isang marker interface at pagkatapos ay suriin kung ang bagay na dumating ay nagpapatupad ng interface na ito o hindi.
  2. Nagdagdag ng utos ng Tulong para sa mga admin. Para sa akin, ito ay isa ring mahalagang bahagi sa pagbuo ng bot na ito.
  3. Tinalakay namin kung paano magdagdag ng paglalarawan at popup ng mga command kapag isinusulat ang mga ito sa isang bot. Kawili-wiling tampok, tiyak na nagkakahalaga ng pagdaragdag.
Batay sa artikulong ito, gumawa ako ng pull request , makikita mo ang mga detalye nito. Salamat sa lahat para sa iyong pansin, gaya ng dati: i-like - subscribe - bell , star para sa aming proyekto, magkomento at i-rate ang artikulo! Magkita-kita tayo sa susunod na artikulo!

Ang isang listahan ng lahat ng mga materyales sa serye ay nasa simula ng artikulong ito.

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