JavaRush /Java блогы /Random-KK /Біз оған әкімші ретінде жұмыс істеу мүмкіндігін және стат...
Roman Beekeeper
Деңгей

Біз оған әкімші ретінде жұмыс істеу мүмкіндігін және статистиканы қосамыз - «A-дан Я-ға Java жобасы»

Топта жарияланған
Баршаңызға сәлем, қымбатты достарым. Сонымен, бот қазірдің өзінде жұмыс істеп, жаңа мақалалар туралы хабарландырулар жіберуде. Егер сіз оны әлі пайдаланбасаңыз, мына сілтеме: Javarush Telegram Bot . Бүгін біз тек әкімшілер үшін жұмыс істейтін пәрмендерді қосу туралы сөйлесетін боламыз. Осы пәрмендердің бірі статистика және анықтамалық тақта болып табылады. Бұл не үшін қажет? Қазіргі уақытта нақты қажеттіліктен гөрі, осы тапсырма аясындағы жұмысты annotationлармен сипаттау қызықтырақ. «А-дан Я-ға Java жобасы»: Әкімші ретінде жұмыс істеу мүмкіндігін және оған статистиканы қосу - 1Біз статистика тобына баратындықтан, оны кеңейтіп, ақпаратты көбірек ете аламыз. MVP-ден кейін, мысалы, авторлар үшін статистиканы қайтаруға болады. Бірақ бұл туралы кейінірек ...)

Олар үшін әкімшілер мен пәрмендерді қосуды түсінейік

Біз жұмысымызды негізгі фorалды жаңартудан және оның негізінде жаңасын құрудан бастаймыз - STEP_9_JRTB-10. Қай пәрмен әкімшілерге және қайсысы барлығына қолданылатынын анықтау үшін топты белгілеу керек. Ол үшін annotation жасайық. Бұл нені білдіреді? Біз мұны бұрын жасаған емеспіз. Мұны IDEA жүйесінде класс жасау кезінде таңдауға болады. Қазір көрсетемін. Пәрмендер бумасында жаңа annotationлар бумасын және оның ішінде AdminCommand annotationсын жасаңыз: «А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  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 пәрменіне қосамыз: «А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  1 - 3 бөлімЕнді бәрі жұмыс істеуі керек ... Әлде жоқ па? Жоқ, әрине)) Біз CommandContainer-ді нәтижені дұрыс шығаруға үйретуіміз керек. Мұны істеу үшін, оған жіберілген нәрсеге байланысты іске қосу пәрменін беретін retrieveCommand әдісін жаңартайық. Біз оның Telegram-дағы пайдаланушы атын әкімші идентификаторы ретінде қолданамыз. Бұл chat_id-ге қарағанда бірегей және оқу оңай. Оны қалай алуға болады? Бұл хабармен бірге келетін Жаңарту нысанында:
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));
}
Мұнда көріп отырғаныңыздай, мен берілген пәрменде AdminCommand annotationсының бар-жоғын тексеретін isAdminCommand әдісін қостым. Ал егер бұл тек әкімші пәрмені болса, біз бұл пайдаланушы атының қол жетімді әкімшілер жинағында бар-жоғын тексереміз. Айтпақшы, міне, OOP, өзінің барлық даңқымен: біз жай ғана интерфейсті өткіземіз, ол кез келген іске асырылуы мүмкін. Бірақ біз командалық интерфейсті жүзеге асыратын сыныпты ғана өткізе аламыз . Және бәрі түсінікті сияқты, тек бір нәрседен басқа: админдер қайдан келді? Қазір көрсетемін. Әзірге мен әкімшілерді орта айнымалысы ретінде жібергім келеді, осылайша оны оңай конфигурациялауға болады. Бұл айнымалыда әкімші болатын telegram пайдаланушыларының барлық пайдаланушы аттары үтірмен бөлінген жол болады. Ол үшін 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 annotationсын қолданамыз , оған коллекция жасау логикасын береміз. Міне, админді қосу аяқталды. Енді әкімші емес адам боттың статистикасы туралы деректерді алғысы келгенде, ол келесі жауапты алады: мен сізді түсінбеймін 😟, түсінгенімді білу үшін /көмектесіңіз. Осылайша біз бот пәрмендері үшін рөлдерді ажыраттық.

Әкімшілер үшін анықтама пәрменін қосу

Әрі қарай, әкімшілер үшін бөлек анықтама пәрменін жасау қисынды болар еді . Болашақта бұл бөлік айтарлықтай өсуі мүмкін. Әкімші анықтамасының мәнін 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))

Ботқа командалардың сипаттамасын қосу

Telegram боттарының тағы бір қызықты мүмкіндігі бар: пайдаланушыға пәрмендерді пайдалануды жеңілдету үшін ол қабылдайтын пәрмендердің мәндері мен сипаттамаларын қосуға болады. Ол неге ұқсайды? Мысалы, BotFather- ке барайық - ең маңызды Telegram боты. Егер сіз қиғаш сызықпен хабарлама жаза бастасаңыз /, бот опцияларды ұсынады: «А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  1-4 бөлімАл егер сіз жазуды жалғастырсаңыз, ол сүзгіден өткізіп, сәйкес опцияларды көрсетеді: «А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  1 - 5 бөлімКеремет функция, солай ма? Сондықтан мен де дәл осылай жасағым келеді. Мен мұны ең жақсы жолмен - Telegram қолданбасы арқылы жасаймын. Мен мұны бағдарламалық түрде жасауға болатынын білемін. Бірақ мен алмаймын. Бұл мақалалар сериясының мақсаттары үшін қажет емес. Мұны қалай жасау керектігін кім білсе, маған жазыңыз, біз оны қосамыз. Осыған байланысты кез келген көмекті қуана қабылдаймын. Мен мұны біз үшін жұмыс істейтін пәрмен үлгісі арқылы жасауға болатынын бір рет оқыдым. Енді мен мұны қалай істеуге болатынын көрсетемін: бізге Telegram-да BotFather табу керек, конфигурациялағыңыз келетін ботты таңдаңыз. Әрі қарай, ботты өңдеуді және командалар туралы бөлімді таңдаңыз. Енді мен Javarush-қа арналған сынақ ботының мысалы арқылы бәрін көрсетемін. BotFather-де біз пәрменді жазамыз: /mybots«А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  1-6 бөлім Әрі қарай, бізге қажет ботты таңдаңыз, менің жағдайда ол test_javarush_community_bot болады: «А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  1-7 бөлімТүймешіктер тізімінен көріп отырғаныңыздай, мұнда сіз таңбалауышты көруге, ботты жоюға және оны келесіге тасымалдауға болады. басқа біреу. Біз ботты өңдеуге мүдделіміз, сондықтан біз Ботты өңдеуді таңдаймыз : «А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  1-8 бөлімАл мұнда біз пәрмендерді өңдеу тармағын таңдаймыз : «А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  1 - 9 бөлімБізге белгілі бір пішімде хабар беру керек, ол командалар ретінде жазылады. Немесе олардың барлығын жойғымыз келсе, /бос деп жазыңыз. Осы мақсатта мен SET_UP_COMMANDS_BOT_FATHER жобасының түбірінде файл жасаймын , онда бірдеңе болған жағдайда оны қалпына келтіру немесе жаңарту оңай болуы үшін барлық командаларымызды жазамын. SET_UP_COMMANDS_BOT_FATHER:
бастау - ботпен жұмысты бастау/қалпына келтіру тоқтату - ботпен жұмысты кідірту addGroupSub - мақалалар тобына жазылу deleteGroupSub - мақалалар тобынан бас тарту listGroupSub - сіз жазылған топтардың тізімі анықтама - менімен жұмыс істеуге көмек алу
Бұл жерде әкімші командаларын тасымалдамайтынымыз анық. Олар туралы тек админдер білуі керек. Осы хабарламаны алып, оны BotFather-ге жіберейік: «А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  1-10 бөлімӘдеттегідей, ол бірінші рет нәтиже бермеді. Бірнеше minutes ойланып, мен барлық командаларды бұрынғыдай CamelCase-де емес, кіші әріппен тапсырдым, бәрі жақсы болды. Біз файлды жаңартамыз: SET_UP_COMMANDS_BOT_FATHER:
бастау - ботпен жұмысты бастау/қалпына келтіру тоқтату - ботпен жұмысты кідірту addgroupsub - мақалалар тобына жазылу deletegroupsub - мақалалар тобына жазылудан бас тарту listgroupsub - сіз жазылған топтардың тізімі анықтама - менімен жұмыс істеуге көмек алу
Енді сіз біздің ботқа кіріп, командалардың автоматты түрде жүктелгенін көре аласыз: «А-дан Я-ға Java жобасы»: оған әкімші және статистика ретінде жұмыс істеу мүмкіндігін қосу.  1-11 бөлімҚараңызшы, қазір қандай әдемі! Мен сондай-ақ осы мақаланың аясында статистиканың функционалдығын кеңейткім келді, бірақ материал мағынасы жағынан да, мазмұны жағынан да көлемді болды. Сондықтан біз мұны келесі жолы қалдырамыз. Яғни, JRTB-10 тапсырмасы толығымен орындалған жоқ: біз оны келесі мақалада аяқтаймыз. Сонымен қатар, мен негізгі ботқа бұрыннан бар барлық өзгерістерді қосамын. Authorға қолдау көрсеткіңіз келеді, бірақ қалай екенін білмейсіз бе? Бұл өте қарапайым - менің tg каналыма , менің GitHub тіркелгіме жазылыңыз және олар туралы өз пікіріңізді осында мақалаларда жазыңыз. Бұл кері байланыс мен үшін маңызды, сондықтан мен олардың оқығанын және оларға қызығушылық танытатынын түсінемін.

қорытындылар

Бүгін нені бастан өткердік:
  1. Біз өзіңіздің annotationңызды қалай қосу керектігін және оны командалардағы рөлдерді бөлу үшін маркер ретінде қалай пайдалануға болатынын талқыладық. Айтпақшы, бұл интерфейс арқылы жасалуы мүмкін еді. Сол сияқты, біз маркер интерфейсін жасаймыз, содан кейін келген нысан осы интерфейсті жүзеге асыра ма, жоқ па тексереміз.
  2. Әкімшілер үшін Анықтама пәрмені қосылды. Маған келетін болсақ, бұл да осы боттың дамуының маңызды бөлігі.
  3. Біз оларды ботта жазу кезінде сипаттама мен қалқымалы пәрмендерді қалай қосу керектігін талқыладық. Қызықты мүмкіндік, міндетті түрде қосу керек.
Осы мақаланың негізінде мен тарту сұрауын жасадым , сіз оның мәліметтерін көре аласыз. Назарларыңызға рахмет, әдеттегідей: лайк - жазылу - қоңырау , біздің жобаға жұлдызша, мақалаға пікір қалдырыңыз және бағалаңыз! Келесі мақалада кездескенше!

Сериядағы барлық материалдардың тізімі осы мақаланың басында.

Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION