JavaRush /Java блогу /Random-KY /Биз ага администратор катары иштөө жөндөмүн жана статисти...
Roman Beekeeper
Деңгээл

Биз ага администратор катары иштөө жөндөмүн жана статистиканы кошобуз - "Адан Яга Java долбоору"

Группада жарыяланган
Баарыңарга салам, кымбаттуу досторум. Ошентип, бот иштеп жатат жана жаңы макалалар жөнүндө эскертмелерди жөнөтүп жатат. Эгер сиз аны колдоно элек болсоңуз, бул шилтеме: Javarush Telegram Bot . Бүгүн биз администраторлор үчүн гана иштей турган буйруктарды кошуу жөнүндө сүйлөшөбүз. Бул буйруктардын бири статистика жана жардам тактасы. Бул эмне үчүн керек? Учурда бул милдеттин алкагында annotationлар менен чыгарманы сүрөттөп берүү анын реалдуу зарылдыгына караганда кызыктуураак. "Java долбоору Адан Яга": Администратор катары иштөө жөндөмүн жана ага статистиканы кошуу - 1Ооба, биз статистика тобуна бара жаткандыктан, аны кеңейтип, маалыматтуураак кыла алабыз. MVPден кийин, мисалы, авторлордун статистикасын кайтаруу мүмкүн болот. Бирок бул тууралуу кийинчерээк...)

Келгиле, алар үчүн администраторлорду жана буйруктарды кошууну түшүнөлү

Биз ишибизди негизги бутакты жаңылоодон жана анын негизинде жаңысын түзүүдөн баштайбыз - 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ге караганда уникалдуу жана окуу оңой. Кантип алса болот? Бул билдирүү менен келген Жаңыртуу 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 annotationсынын бар же жок экенин текшерет. Ал эми бул администратор үчүн гана буйрук болсо, биз жеткorктүү администраторлор жыйнагыбызда ал колдонуучунун аты бар же жок экенин текшеребиз. Айтмакчы, бул жерде, OOP, өзүнүн бардык даңкы менен: биз жөн гана интерфейсти өткөрүп жатабыз, ал каалаган ишке ашырылышы мүмкүн. Бирок биз Command интерфейсин ишке ашырган класстан гана өтө алабыз . Анан баары түшүнүктүү окшойт, бир нерседен башкасы: админдер кайдан келди? Мен сага азыр көрсөтөм. Азырынча мен администраторлорду чөйрө өзгөрмөсү катары өткөрүп бергим келет, ошондуктан аны оңой конфигурациялоого болот. Бул өзгөрмө администратор боло турган телеграмма колдонуучуларынын бардык колдонуучу аттары үтүр менен бөлүнгөн сапты камтыйт. Бул үчүн 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 ботторунун дагы бир кызыктуу өзгөчөлүгү бар: колдонуучуга буйруктарды колдонууну жеңилдетүү үчүн сиз кабыл алган буйруктардын маанилерин жана сүрөттөмөлөрүн кошо аласыз. Ал эмнеге окшош? Мисалы, эң маанилүү Telegram боту болгон BotFatherге баралы. Эгер сиз сызык / менен билдирүү жаза баштасаңыз, бот варианттарды сунуштайт: "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-бөлүкЖана бул жерден биз тандайбыз Edit Commands : "Java долбоору Адан Яга": Администратор катары иштөө жөндөмүн жана ага статистиканы кошуу.  1-9-бөлүкБиз жөн гана белгилүү бир форматта билдирүүнү беришибиз керек жана ал буйрук катары жазылат. Же алардын баарын алып салгыбыз келсе, /бош деп жазыңыз. Бул максатта, мен SET_UP_COMMANDS_BOT_FATHER долбоорунун түбүндө файл түзөм , анда бир нерсе болуп калса калыбына келтирүү же жаңыртуу оңой болушу үчүн бардык буйруктарыбызды жазам. SET_UP_COMMANDS_BOT_FATHER:
баштоо - бот менен ишти баштоо/калыбына келтирүү токтотуу - бот менен иштөөнү тындыруу addGroupSub - макалалар тобуна жазылуу deleteGroupSub - макалалар тобуна жазылууну токтотуу listGroupSub - сиз жазылган топтордун тизмеси жардам - ​​мени менен иштөөгө жардам алуу
Биз бул жерде администратордук буйруктарды аткарбай турганыбыз түшүнүктүү. Алар жөнүндө админдер гана бorши керек. Келгиле, бул билдирүүнү алып, аны BotFatherге өткөрүп берели: "Java долбоору Адан Яга": Администратор катары иштөө жөндөмүн жана ага статистиканы кошуу.  1-10-бөлүкАдаттагыдай эле, биринчи жолу ишке ашкан жок. Бир нече мүнөт ойлонуп, мен бардык буйруктарды мурункудай CamelCase менен эмес, кичине тамга менен тапшырдым, баары ойдогудай болду. Биз файлыбызды жаңыртабыз: SET_UP_COMMANDS_BOT_FATHER:
баштоо - бот менен ишти баштоо/калыбына келтирүү токтотуу - бот менен иштөөнү тындыруу addgroupsub - макалалар тобуна жазылуу deletegroupsub - макалалар тобуна жазылууну токтотуу listgroupsub - сиз жазылган топтордун тизмеси жардам - ​​мени менен иштөөгө жардам алуу
Эми сиз биздин ботко кирип, буйруктардын автоматтык түрдө жүктөлгөндүгүн көрө аласыз: "Java долбоору Адан Яга": Администратор катары иштөө жөндөмүн жана ага статистиканы кошуу.  1-11-бөлүкКараңыз, бул кандай сонун! Мен дагы ушул макаланын алкагында статистиканын функционалдуулугун кеңейтүүнү кааладым, бирок материал мааниси жагынан да, мазмуну боюнча да көлөмдүү болчу. Ошондуктан, биз муну кийинкиге жылдырабыз. Башкача айтканда, JRTB-10 тапшырмасы толук аткарылган жок: биз аны кийинки макалада бүтүрөбүз. Ошол эле учурда мен негизги ботко буга чейин болгон бардык өзгөртүүлөрдү кошом. Authorду колдогуңуз келеби, бирок кантип экенин билбейсизби? Бул абдан жөнөкөй - менин tg каналыма , менин GitHub аккаунтума жазылыңыз жана бул жердеги макалаларда алар жөнүндө өз пикириңизди жазыңыз. Бул пикир мен үчүн маанилүү, ошондуктан алар окуп, аларга кызыгып жатканын түшүнөм.

корутундулар

Келгиле, бүгүнкү күндө эмнелерди өткөрдүк:
  1. Биз өз annotationңызды кантип кошууну жана аны командалардагы ролдорду аныктоо үчүн маркер катары кантип колдонсо болорун талкууладык. Айтмакчы, муну интерфейстин жардамы менен жасаса болмок. Ошол сыяктуу эле, биз маркер интерфейсин түзүп, андан кийин келген an object бул интерфейсти ишке ашырабы же жокпу текшеребиз.
  2. Администраторлор үчүн Жардам буйругу кошулду. Мага келсек, бул да бул ботту өнүктүрүүдө маанилүү бөлүгү.
  3. Биз ботко жазууда буйруктардын сүрөттөмөсүн жана калкыма терезелерин кантип кошууну талкууладык. Кызыктуу өзгөчөлүк, албетте, кошуу керек.
Бул макаланын негизинде мен тартуу өтүнүчүн түздүм , анын чоо-жайын көрө аласыз. Баарыңыздарга көңүл бурганыңыз үчүн рахмат, адаттагыдай эле: лайк - жазылуу - коңгуроо , биздин долбоорго жылдыз, комментарий жана макалага баа! Кийинки макалада көрүшкөнчө!

Сериядагы бардык материалдардын тизмеси ушул макаланын башында.

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION