JavaRush /Блоги Java /Random-TG /Мо қобилияти кор кардан ба сифати администратор ва оморро...
Roman Beekeeper
Сатҳи

Мо қобилияти кор кардан ба сифати администратор ва оморро барои ӯ илова мекунем - "Лоиҳаи Java аз A то Я"

Дар гурӯҳ нашр шудааст
Салом ба хама, дустони азизам. Ҳамин тавр, бот аллакай кор мекунад ва дар бораи мақолаҳои нав огоҳинома мефиристад. Агар шумо то ҳол онро истифода набаред, инҷо истиноди зерин аст: Javarush Telegram Bot . Хуб, имрӯз мо дар бораи илова кардани фармонҳое сӯҳбат хоҳем кард, ки танҳо барои маъмурон кор мекунанд. Яке аз ин фармонҳо омор ва тахтаи кӯмак аст. Чаро ин зарур аст? Дар айни замон дар доираи ин вазифа бо эзодот тасвир кардани асар аз зарурати вокеии он дида шавковартар аст. "Лоиҳаи Java аз A то Я": Илова кардани қобorяти кор ҳамчун маъмур ва омор барои ӯ - 1Хуб, азбаски мо ба дастаи омор меравем, мо метавонем онро васеъ кунем ва онро бештар иттилоотӣ гардонем. Пас аз MVP, масалан, омори муаллифонро баргардонидан мумкин аст. Аммо дар ин бора баъдтар...)

Биёед бифаҳмем, ки илова кардани администраторҳо ва фармонҳо барои онҳо

Мо кори худро аз навсозии шохаи асосӣ ва таъсиси фorали нав дар асоси он оғоз мекунем - STEP_9_JRTB-10. Барои фаҳмидани он, ки кадом фармон ба маъмурон ва кадоме ба ҳама дахл дорад, шумо бояд фармонро нишон диҳед. Барои ин, биёед annotation эҷод кунем. Ин чӣ маъно дорад? Мо пештар ин корро накарда будем. Инро ҳангоми сохтани синф дар IDEA интихоб кардан мумкин аст. Ман ҳоло ба шумо нишон медиҳам. Дар бастаи фармон бастаи нави эзоҳро эҷод кунед ва дар он шарҳи AdminCommand: "Лоиҳаи Java аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Қисми 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 аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Қисми 1 - 3Акнун ҳама чиз бояд кор кунад... Ё не? Не, албатта)) Мо бояд CommandContainer-ро таълим диҳем, ки натиҷаро дуруст тавлид кунад. Барои ин, биёед усули retrieveCommand -ро навсозӣ кунем , ки вобаста ба он чизе, ки ба он интиқол дода мешавад, фармон медиҳад. Мо номи корбарии ӯро дар Telegram ҳамчун идентификатори администратор истифода хоҳем кард. Он назар ба chat_id беназир ва хондан осонтар аст. Чӣ тавр ба даст овардан мумкин аст? Он дар an objectи Навсозӣ ҷойгир аст, ки бо паём меояд:
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));
}
Тавре ки шумо дар ин ҷо мебинед, ман усули isAdminCommand -ро илова кардам , ки тафтиш мекунад, ки оё дар фармони додашуда шарҳи AdminCommand мавҷуд аст. Ва агар он танҳо фармони маъмурӣ бошад, мо месанҷем, ки оё ин номи корбар дар маҷмӯаи администраторҳои дастрас мавҷуд аст ё на. Дар омади гап, ин аст, OOP, бо тамоми ҷалоли худ: мо танҳо интерфейсеро мегузарем, ки он метавонад ҳама гуна татбиқ бошад. Аммо мо метавонем танҳо синферо гузарем, ки интерфейси Фармонро амалӣ мекунад . Ва ба назар мерасад, ки ҳама чиз равшан аст, ба истиснои як чиз: администраторҳо аз куҷо пайдо шуданд? Ман ҳоло ба шумо нишон медиҳам. Ҳоло ман мехоҳам маъмуронро ҳамчун тағирёбандаи муҳити зист гузаронам, то он ба осонӣ танзим карда шавад. Ин тағирёбанда сатреро дар бар мегирад, ки дар он ҳамаи корбарони корбарони телеграмма, ки маъмур хоҳанд буд, бо вергул ҷудо карда шудаанд. Барои ин, ба 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);
}
Тавре ки шумо аз конструктори боло мебинед, мо боз шарҳи арзишро истифода мебарем , ки ба он мантиқи эҷоди коллексияро мегузорем. Ва ин аст, илова кардани администратор ба охир расид. Ҳоло, вақте ки администраторе нест, ки мехоҳад маълумот дар бораи омори бот ба даст орад, ӯ ҷавоби зеринро мегирад: Ман шуморо нафаҳмидам 😟, нависед / кӯмак кунед, то бифаҳмам, ки ман чӣ мефаҳмам. Бо ин роҳ мо нақшҳоро барои фармонҳои бот фарқ кардем.

Илова кардани фармони кӯмак барои маъмурон

Минбаъд, мантиқӣ мебуд, ки барои маъмурон як фармони кӯмаки алоҳида эҷод кунед . Дар оянда ин қисм метавонад хеле афзоиш ёбад. Ба 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 аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Қисми 1 - 4Ва агар шумо навиштанро идома диҳед, он имконоти мувофиқро филтр мекунад ва нишон медиҳад: "Лоиҳаи Java аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Кисми 1 — 5Функсияи олӣ, дуруст? Аз ин рӯ, ман мехоҳам дар ин ҷо ҳам кор кунам. Ман онро ба таври беҳтарин иҷро мекунам - тавассути барномаи Telegram. Ман медонам, ки ин метавонад ба таври барномавӣ анҷом дода шавад. Аммо наметавонам. Ин барои мақсадҳои ин силсила мақолаҳо зарур нест. Агар касе донад, ки ин корро кунад, ба ман нависед, мо онро илова мекунем. Ман бо камоли майл ҳама гуна кӯмакро қабул мекунам. Ман боре хондам, ки ин корро тавассути намунаи фармоне, ки барои мо кор мекунад, иҷро кардан мумкин аст. Ҳоло ман ба шумо нишон медиҳам, ки чӣ тавр ин корро карда метавонам: мо бояд BotFather-ро дар Telegram пайдо кунем ва ботро интихоб кунем, ки мо танзим кунем. Баъдан, таҳрири бот ва қисматро дар бораи фармонҳо интихоб кунед. Ҳоло ман ҳама чизро бо мисоли боти озмоишии худ барои Javarush нишон медиҳам. Дар BotFather мо фармонро менависем: /mybots"Лоиҳаи Java аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Қисми 1 - 6 Баъдан, боти ба мо лозимиро интихоб кунед, дар ҳолати ман он test_javarush_community_bot хоҳад буд: "Лоиҳаи Java аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Қисми 1 - 7Тавре ки шумо аз рӯйхати тугмаҳо мебинед, дар ин ҷо шумо метавонед токенро бубинед, ботро нест кунед ва ба он интиқол диҳед. каси дигар. Мо ба таҳрири бот таваҷҷӯҳ дорем, аз ин рӯ, мо Edit Bot-ро интихоб мекунем : "Лоиҳаи Java аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Кисми 1 — 8Ва дар ин ҷо мо Фармонҳои Таҳририро интихоб мекунем : "Лоиҳаи Java аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Кисми 1 — 9Мо танҳо лозим аст, ки паёмро дар формати мушаххас пешниҳод кунем ва он ҳамчун фармон сабт карда мешавад. Ё агар мо хоҳем, ки ҳамаи онҳоро нест кунем, /холӣ нависед. Бо ин мақсад, ман файлеро дар решаи лоиҳаи SET_UP_COMMANDS_BOT_FATHER эҷод мекунам , ки дар он ҳамаи фармонҳои худро менависам, то дар сурати рух додани чизе барқарор ё навсозӣ осон бошад. SET_UP_COMMANDS_BOT_FATHER:
оғоз - оғоз/барқарор кардани кор бо бот stop - таваққуфи кор бо бот addGroupSub - обуна ба гурӯҳи мақолаҳо deleteGroupSub - аз як гурӯҳи мақолаҳо хориҷ шавед listGroupSub - рӯйхати гурӯҳҳое, ки шумо ба онҳо обуна шудаед, кӯмак гиред - дар кор бо ман кӯмак гиред
Маълум аст, ки мо дар ин ҷо фармонҳои администраторро иҷро намекунем. Дар бораи онҳо бояд танҳо администраторҳо огоҳ бошанд. Биёед ин паёмро гирем ва онро ба BotFather гузорем: "Лоиҳаи Java аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Кисми 1 — 10Тавре ки одатан ин тавр аст, бори аввал ин кор наомад. Пас аз чанд дақиқаи андеша, ман ҳама фармонҳоро бо ҳарфи хурд гузаронидам, на дар CamelCase мисли пештара ва ҳама чиз хуб шуд. Мо дар файли худ навсозӣ мекунем: SET_UP_COMMANDS_BOT_FATHER:
оғоз - оғоз/барқарор кардани кор бо бот stop - таваққуф кардани кор бо бот addgroupsub - обуна ба гурӯҳи мақолаҳо deletegroupsub - обуна аз гурӯҳи мақолаҳо listgroupsub - рӯйхати гурӯҳҳое, ки шумо ба онҳо обуна шудаед, кӯмак гиред - кӯмак дар кор бо ман гиред
Акнун шумо метавонед ба боти мо равед ва бубинед, ки оё фармонҳо ба таври худкор бор карда шудаанд: "Лоиҳаи Java аз A то Я": Илова кардани қобorяти кор ҳамчун администратор ва омор барои ӯ.  Кисми 1 — 11Бингар, ки ҳоло чӣ қадар зебост! Ман инчунин мехостам, ки дар доираи ин мақола функсияҳои оморро васеъ кунам, аммо мавод аллакай ҳам аз ҷиҳати маъно ва ҳам аз ҷиҳати мундариҷа ҳаҷмовар буд. Аз ин рӯ, мо ин корро барои дафъаи оянда ба таъхир меандозем. Яъне, супориши ЯРТБ-10 пурра ичро нашудааст: мо онро дар мадолаи оянда ба анчом мерасонем. Ҳамзамон, ман ҳамаи тағиротҳоеро, ки аллакай вуҷуд доранд, ба боти асосӣ илова мекунам. Мехоҳед муаллифро дастгирӣ кунед, аммо намедонед, ки чӣ тавр? Ин хеле содда аст - ба канали tg , ҳисоби GitHub- и ман обуна шавед ва андешаи худро дар бораи онҳо дар мақолаҳо дар ин ҷо нависед. Ин фикру мулоҳизаҳо барои ман муҳим аст, бинобар ин ман мефаҳмам, ки онҳоро мехонанд ва ба онҳо таваҷҷӯҳ доранд.

хулосахо

Биёед ҷамъбаст кунем, ки мо имрӯз аз сар гузаронидаем:
  1. Мо муҳокима кардем, ки чӣ гуна шарҳи шахсии худро илова кардан мумкин аст ва чӣ гуна онро метавон ҳамчун аломат барои муайян кардани нақшҳо дар гурӯҳҳо истифода бурд. Воқеан, ин метавонист бо истифода аз интерфейс анҷом дода шавад. Ба ҳамин тариқ, мо интерфейси маркер эҷод мекунем ва сипас тафтиш мекунем, ки an objectи воридшуда ин интерфейсро амалӣ мекунад ё не.
  2. Фармони кӯмак барои администраторҳо илова карда шуд. Дар мавриди ман, ин ҳам як қисми муҳим дар рушди ин бот аст.
  3. Мо муҳокима кардем, ки чӣ тавр илова кардани тавсиф ва поп-ап фармонҳо ҳангоми навиштани онҳо дар бот. Хусусияти ҷолиб, бешубҳа сазовори илова кардан.
Дар асоси ин мақола, ман як дархости кашидан эҷод кардам , шумо метавонед тафсилоти онро бубинед. Ташаккур ба ҳама барои таваҷҷуҳ, чун маъмулӣ: лайк - обуна - занг зан , ситораи лоиҳаи мо, шарҳ ва баҳои мақола! Дар мақолаи навбатӣ вохӯред!

Рӯйхати ҳамаи маводҳои силсила дар аввали ин мақола аст.

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION