JavaRush /Blog Java /Random-PL /Dodajemy możliwość pracy jako administrator i statystyki ...
Roman Beekeeper
Poziom 35

Dodajemy możliwość pracy jako administrator i statystyki dla niego - „Projekt Java od A do Z”

Opublikowano w grupie Random-PL
Witam wszystkich, moi drodzy przyjaciele. Zatem bot już działa i wysyła powiadomienia o nowych artykułach. Jeśli jeszcze go nie używasz, oto link: Javarush Telegram Bot . Cóż, dzisiaj porozmawiamy o dodawaniu poleceń, które działają tylko dla administratorów. Jednym z takich poleceń są statystyki i tablica pomocy. Dlaczego jest to konieczne? W tej chwili bardziej interesujące jest opisywanie pracy adnotacjami w ramach tego zadania, niż faktyczna potrzeba. „Projekt Java od A do Z”: Dodanie możliwości pracy na stanowisku administratora i statystyk dla niego - 1Cóż, skoro idziemy do zespołu statystycznego, możemy go rozszerzyć i uczynić go bardziej informacyjnym. Po MVP możliwe będzie zwrócenie np. statystyk dla autorów. Ale o tym później...)

Rozumiemy dodawanie dla nich administratorów i poleceń

Naszą pracę rozpoczynamy od aktualizacji głównej gałęzi i stworzenia na jej podstawie nowej - STEP_9_JRTB-10. Aby dowiedzieć się, które polecenie dotyczy administratorów, a które wszystkich, musisz oznaczyć zespół etykietą. W tym celu utwórzmy adnotację. Co to znaczy? Nie robiliśmy tego wcześniej. Można to wybrać podczas tworzenia klasy w IDEA. Pokażę ci teraz. W pakiecie poleceń utwórz nowy pakiet adnotacji , a w nim adnotację AdminCommand: „Projekt Java od A do Z”: Dodanie możliwości pracy jako administrator i statystyk dla niego.  Część 1 - 2Sama adnotacja będzie wyglądać następująco:
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 {
}
Nie potrzebujemy tu niczego więcej. Następnie dodajemy to do naszego polecenia StatCommand: „Projekt Java od A do Z”: Dodanie możliwości pracy jako administrator i statystyk dla niego.  Część 1 - 3Teraz wszystko powinno działać... Czy nie? Nie, oczywiście)) Musimy nauczyć nasz CommandContainer, aby poprawnie generował wynik. Aby to zrobić, zaktualizujmy metodę retrieveCommand , która wydaje polecenie do uruchomienia w zależności od tego, co zostanie do niej przekazane. Będziemy używać jego nazwy użytkownika w Telegramie jako identyfikatora administratora. Jest wyjątkowy i łatwiejszy do odczytania niż chat_id. Jak to zdobyć? Znajduje się on w obiekcie Update, któremu towarzyszy komunikat:
update.getMessage().getFrom().getUserName()
Podsumowując wszystko powyżej, zaktualizujmy metodę 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));
}
Jak widać, dodałem metodę isAdminCommand , która sprawdza, czy przy podanym poleceniu znajduje się adnotacja AdminCommand. A jeśli jest to polecenie przeznaczone tylko dla administratora, sprawdzamy, czy mamy tę nazwę użytkownika w naszej kolekcji dostępnych administratorów. Swoją drogą oto OOP w całej okazałości: po prostu przekazujemy interfejs, którym może być dowolna implementacja. Ale możemy przekazać tylko klasę, która implementuje interfejs Command . I wszystko wydaje się jasne, poza jedną rzeczą: skąd wzięli się admini? Pokażę ci teraz. Na razie chcę przekazać administratorów jako zmienną środowiskową, aby można było ją łatwo skonfigurować. Zmienna ta będzie zawierała wiersz, w którym wskazane będą wszystkie nazwy użytkowników telegramu, którzy będą administratorami, oddzielone przecinkami. Aby to zrobić, dodaj do application.properties:
bot.admins: robeskman,romankh3
W konstruktorze CommandContainer przekażemy kolekcję adminów i zainicjujemy ją:
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;
I już w JavaRushTelegramBot będzie cała magia pobierania kolekcji z ciągu znaków we właściwościach:
@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);
}
Jak widać z powyższego konstruktora, ponownie używamy adnotacji Value , do której przekazujemy logikę tworzenia kolekcji. I tyle, dodawanie administratora dobiegło końca. Teraz, gdy osoba niebędąca administratorem będzie chciała poznać dane na temat statystyk bota, otrzyma następującą odpowiedź: Nie rozumiem Cię 😟, napisz /pomoc, żeby dowiedzieć się, co rozumiem. W ten sposób rozróżniliśmy role poleceń bota.

Dodanie polecenia pomocy dla administratorów

Następnie logiczne byłoby utworzenie osobnego polecenia pomocy dla administratorów. W przyszłości ta część może znacząco wzrosnąć. Dodaj wartość pomocy administratora do CommandName:
ADMIN_HELP("/ahelp")
Utwórz klasę AdminHelpCommand w pakiecie poleceń:
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);
   }
}
Póki co jest to bardzo proste. W przyszłości może całkiem nieźle wyrosnąć. Dla tego polecenia test z naszego szablonu:
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);
   }
}
Oczywiście polecenie trzeba dodać do CommandContainera na naszej mapie:
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

Dodanie opisu poleceń do bota

Boty telegramowe mają jeszcze jedną ciekawą funkcję: możesz dodawać wartości i opisy akceptowanych poleceń, aby ułatwić użytkownikowi korzystanie z poleceń. Jak to wygląda? Przejdźmy na przykład do BotFather – najważniejszego bota Telegramu. Jeśli zaczniesz pisać wiadomość z ukośnikiem /, bot zaoferuje opcje: „Projekt Java od A do Z”: Dodanie możliwości pracy jako administrator i statystyk dla niego.  Część 1 - 4A jeśli będziesz kontynuować pisanie, przefiltruje i wyświetli odpowiednie opcje: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 5Fajna funkcjonalność, prawda? Dlatego chcę zrobić to samo tutaj. Zrobię to najlepiej jak potrafię – poprzez aplikację Telegram. Wiem, że da się to zrobić programowo. Ale nie mogę. Nie jest to konieczne na potrzeby tej serii artykułów. Jeśli ktoś wie jak to zrobić niech napisze, dodamy. Chętnie przyjmę w tym zakresie każdą pomoc. Kiedyś przeczytałem, że można to zrobić za pomocą wzorca poleceń, który działa dla nas. Teraz pokażę ci, jak mogę to zrobić: musimy znaleźć BotFather w Telegramie, wybrać bota, którego chcemy skonfigurować. Następnie wybierz edycję bota i sekcję dotyczącą poleceń. Teraz pokażę wszystko na przykładzie mojego bota testowego dla Javarush. W BotFather wpisujemy polecenie: /mybots"Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 6 Następnie wybieramy bota, którego potrzebujemy, w moim przypadku będzie to test_javarush_community_bot: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 7Jak widać z listy przycisków, tutaj możesz zobaczyć token, usunąć bota i przenieść go do ktoś inny. Jesteśmy zainteresowani edycją bota, więc wybieramy Edytuj bota : "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 8I tutaj wybieramy Edytuj polecenia : "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 9Musimy tylko podać wiadomość w określonym formacie, a zostanie ona zarejestrowana jako polecenia. Lub jeśli chcemy usunąć je wszystkie, napisz /empty. W tym celu utworzę plik w katalogu głównym projektu SET_UP_COMMANDS_BOT_FATHER , w którym będę pisać wszystkie nasze polecenia, aby łatwo było je przywrócić lub zaktualizować, jeśli coś się stanie. SET_UP_COMMANDS_BOT_FATHER:
start - rozpoczęcie/przywrócenie pracy z botem stop - wstrzymanie pracy z botem addGroupSub - subskrybowanie grupy artykułów DeleteGroupSub - wypisanie się z grupy artykułów listGroupSub - lista grup, do których jesteś zapisany pomoc - uzyskaj pomoc w pracy ze mną
Oczywiste jest, że nie wykonujemy tutaj poleceń administratora. Tylko administratorzy powinni o nich wiedzieć. Weźmy tę wiadomość i przekażmy ją BotFather: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 10Jak to zwykle bywa, nie wyszło za pierwszym razem. Po kilku minutach namysłu przekazałem wszystkie polecenia małymi literami, a nie jak poprzednio w CamelCase i wszystko poszło dobrze. Aktualizujemy w naszym pliku: SET_UP_COMMANDS_BOT_FATHER:
start - rozpoczęcie/przywrócenie pracy z botem stop - pauza pracy z botem addgroupsub - subskrybuj grupę artykułów usuńgroupsub - wypisz się z grupy artykułów listgroupsub - lista grup, do których jesteś subskrybowany pomoc - uzyskaj pomoc w pracy ze mną
Teraz możesz przejść do naszego bota i sprawdzić, czy polecenia zostały załadowane automatycznie: "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 11Spójrz, jak pięknie jest teraz! Chciałem także rozszerzyć funkcjonalność statystyk w ramach tego artykułu, ale materiał był już obszerny zarówno pod względem znaczeniowym, jak i treściowym. Dlatego odłożymy to na następny raz. Oznacza to, że zadanie JRTB-10 nie zostało całkowicie wykonane: zakończymy je w następnym artykule. Jednocześnie dodam wszystkie zmiany, które już istnieją do głównego bota. Chcesz wesprzeć autora, ale nie wiesz jak? To bardzo proste - zasubskrybuj mój kanał tg , moje konto GitHub i napisz swoją opinię na ich temat w artykułach tutaj. Ta opinia jest dla mnie ważna, więc rozumiem, że są czytani i zainteresowani nimi.

wnioski

Podsumujmy przez co dzisiaj przeszliśmy:
  1. Omówiliśmy, jak dodać własną adnotację i jak można ją wykorzystać jako znacznik do wyznaczania ról w zespołach. Nawiasem mówiąc, można było to zrobić za pomocą interfejsu. W ten sam sposób stworzylibyśmy interfejs znacznika, a następnie sprawdzilibyśmy, czy otrzymany obiekt implementuje ten interfejs, czy nie.
  2. Dodano polecenie Pomoc dla administratorów. Jeśli chodzi o mnie, jest to również ważna część rozwoju tego bota.
  3. Omówiliśmy, jak dodać opis i wyskakujące okienko poleceń podczas pisania ich w bocie. Ciekawa funkcja, zdecydowanie warta dodania.
Na podstawie tego artykułu stworzyłem pull request , możesz zobaczyć jego szczegóły. Dziękuję wszystkim za uwagę, jak zwykle: lajk - subskrybuj - dzwonek , gwiazdka dla naszego projektu, komentarz i ocena artykułu! Do zobaczenia w następnym artykule!

Lista wszystkich materiałów wchodzących w skład serii znajduje się na początku artykułu.

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