JavaRush /Blog Java /Random-FR /Nous ajoutons la possibilité de travailler en tant qu'adm...
Roman Beekeeper
Niveau 35

Nous ajoutons la possibilité de travailler en tant qu'administrateur et des statistiques pour lui - "Projet Java de A à Z"

Publié dans le groupe Random-FR
Bonjour à tous, mes chers amis. Ainsi, le bot fonctionne déjà et envoie des notifications sur les nouveaux articles. Si vous ne l'utilisez pas encore, voici le lien : Javarush Telegram Bot . Eh bien, aujourd'hui, nous allons parler de l'ajout de commandes qui ne fonctionnent que pour les administrateurs. L'une de ces commandes est le tableau de statistiques et d'aide. Pourquoi est-ce nécessaire ? Pour le moment, il est plus intéressant de décrire le travail avec des annotations dans le cadre de cette tâche que sa nécessité réelle. "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui - 1Eh bien, puisque nous nous tournons vers l'équipe des statistiques, nous pouvons l'élargir et la rendre plus informative. Après le MVP, il sera possible de retourner des statistiques pour les auteurs par exemple. Mais plus là-dessus plus tard...)

Comprenons l'ajout d'administrateurs et de commandes pour eux

Nous commençons notre travail en mettant à jour la branche principale et en créant une nouvelle basée sur celle-ci - STEP_9_JRTB-10. Pour déterminer quelle commande s'applique aux administrateurs et laquelle s'applique à tout le monde, vous devez étiqueter la commande. Pour ce faire, créons une annotation. Qu'est-ce que ça veut dire? Nous ne l'avons jamais fait auparavant. Ceci peut être sélectionné lors de la création d’une classe dans IDEA. Je vais vous montrer maintenant. Dans le package de commandes, créez un nouveau package d'annotations et dedans l'annotation AdminCommand : "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 - 2L'annotation elle-même ressemblera à ceci :
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 {
}
Nous n'avons besoin de rien d'autre ici. Ensuite, nous l'ajoutons à notre commande StatCommand : "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 à 3Maintenant, tout devrait fonctionner... Ou pas ? Non, bien sûr)) Nous devons apprendre à notre CommandContainer à produire correctement le résultat. Pour ce faire, mettons à jour la méthode retrieveCommand , qui émet une commande à exécuter en fonction de ce qui lui est transmis. Nous utiliserons son nom d'utilisateur dans Telegram comme identifiant d'administrateur. Il est unique et plus facile à lire que chat_id. Comment l'obtenir? C'est dans l'objet Update, qui accompagne le message :
update.getMessage().getFrom().getUserName()
Pour résumer tout ce qui précède, mettons à jour la méthode 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));
}
Comme vous pouvez le voir ici, j'ai ajouté la méthode isAdminCommand , qui vérifie s'il existe une annotation AdminCommand sur la commande fournie. Et s'il s'agit d'une commande réservée aux administrateurs, nous vérifions si nous avons ce nom d'utilisateur dans notre collection d'administrateurs disponibles. Au fait, la voici, la POO, dans toute sa splendeur : nous passons simplement une interface, qui peut être n'importe quelle implémentation. Mais nous ne pouvons transmettre que la classe qui implémente l' interface Command . Et tout semble clair, sauf une chose : d'où viennent les administrateurs ? Je vais vous montrer maintenant. Pour l'instant, je souhaite transmettre les administrateurs comme variable d'environnement afin qu'ils puissent être facilement configurés. Cette variable contiendra une ligne dans laquelle sont indiqués tous les noms d'utilisateur des utilisateurs de télégrammes qui seront administrateurs, séparés par des virgules. Pour ce faire, ajoutez à application.properties :
bot.admins: robeskman,romankh3
Dans le constructeur CommandContainer, nous allons transmettre la collection d'administrateurs et l'initialiser :
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;
Et déjà dans JavaRushTelegramBot, il y aura toute la magie d'obtenir une collection à partir d'une chaîne dans les propriétés :
@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);
}
Comme vous pouvez le voir dans le constructeur ci-dessus, nous utilisons à nouveau l' annotation Value , dans laquelle nous transmettons la logique de création de la collection. Et voilà, l'ajout de l'administrateur est terminé. Désormais, lorsqu'un non-administrateur souhaite obtenir des données sur les statistiques du bot, il recevra la réponse suivante : Je ne vous comprends pas 😟, écrivez /help pour savoir ce que je comprends. De cette façon, nous avons différencié les rôles des commandes du bot.

Ajout d'une commande d'aide pour les administrateurs

Ensuite, il serait logique de créer une commande d'aide distincte pour les administrateurs. À l’avenir, cette part pourrait augmenter considérablement. Ajoutez la valeur d'aide de l'administrateur au CommandName :
ADMIN_HELP("/ahelp")
Créez la classe AdminHelpCommand dans le package de commandes :
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);
   }
}
Jusqu'à présent, c'est très simple. Il se pourrait bien qu’elle se développe assez bien à l’avenir. Pour cette commande, un test de notre 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);
   }
}
Bien entendu, la commande doit être ajoutée au CommandContainer dans notre map :
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

Ajout d'une description des commandes au bot

Les robots Telegram ont une autre fonctionnalité intéressante : vous pouvez ajouter des valeurs et des descriptions des commandes qu'ils acceptent pour faciliter l'utilisation des commandes par l'utilisateur. À quoi cela ressemble-t-il? Pour un exemple, prenons BotFather – le bot Telegram le plus important. Si vous commencez à écrire un message avec une barre oblique /, le bot proposera des options : "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 à 4Et si vous continuez à écrire, il filtrera et affichera les options pertinentes : "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 à 5Une fonctionnalité sympa, n'est-ce pas ? Je veux donc faire la même chose ici. Je le ferai de la meilleure façon possible - via l'application Telegram. Je sais que cela peut être fait par programme. Mais je ne peux pas. Cela n’est pas nécessaire aux fins de cette série d’articles. Si quelqu'un sait comment faire, écrivez-moi, nous l'ajouterons. J'accepterai volontiers toute aide à ce sujet. J'ai lu une fois que cela pouvait être fait via le modèle de commande qui fonctionne pour nous. Maintenant, je vais vous montrer comment faire cela : nous devons trouver BotFather dans Telegram, sélectionner le bot que nous voulons configurer. Ensuite, sélectionnez la modification du bot et la section sur les commandes. Maintenant, je vais tout montrer en utilisant l'exemple de mon robot de test pour Javarush. Chez BotFather, nous écrivons la commande : /mybots"Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 à 6 Ensuite, sélectionnez le bot dont nous avons besoin, dans mon cas ce sera test_javarush_community_bot : "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 à 7Comme vous pouvez le voir dans la liste des boutons, ici vous pouvez voir le jeton, supprimer le bot et le transférer vers quelqu'un d'autre. Nous souhaitons éditer le bot, nous sélectionnons donc Modifier le bot : "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 à 8Et ici nous sélectionnons Modifier les commandes : "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 à 9Nous devons juste fournir un message dans un format spécifique, et il sera enregistré sous forme de commandes. Ou si nous voulons tous les supprimer, écrivez /empty. Pour cela, je vais créer un fichier à la racine du projet SET_UP_COMMANDS_BOT_FATHER , dans lequel j'écrirai toutes nos commandes afin qu'il soit facile de restaurer ou de mettre à jour si quelque chose arrive. SET_UP_COMMANDS_BOT_FATHER :
start - démarrer/restaurer le travail avec le bot stop - suspendre le travail avec le bot addGroupSub - s'abonner à un groupe d'articles deleteGroupSub - se désabonner d'un groupe d'articles listGroupSub - liste des groupes auxquels vous êtes abonné help - obtenir de l'aide pour travailler avec moi
Il est clair que nous ne transportons pas de commandes d'administration ici. Seuls les administrateurs devraient les connaître. Prenons ce message et transmettons-le à BotFather : "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 à 10comme c'est généralement le cas, cela n'a pas fonctionné du premier coup. Après quelques minutes de réflexion, j'ai passé toutes les commandes en minuscules, et non en CamelCase comme avant, et tout s'est bien passé. Nous mettons à jour dans notre fichier : SET_UP_COMMANDS_BOT_FATHER :
start - démarrer/restaurer le travail avec le bot stop - mettre en pause le travail avec le bot addgroupsub - s'abonner à un groupe d'articles deletegroupsub - se désabonner d'un groupe d'articles listgroupsub - liste des groupes auxquels vous êtes abonné help - obtenir de l'aide pour travailler avec moi
Vous pouvez maintenant accéder à notre bot et voir si les commandes ont été chargées automatiquement : "Projet Java de A à Z" : Ajout de la possibilité de travailler en tant qu'administrateur et de statistiques pour lui.  Partie 1 - 11Regardez comme c'est beau maintenant ! Je voulais également étendre les fonctionnalités des statistiques dans le cadre de cet article, mais le matériel était déjà volumineux tant dans le sens que dans le contenu. Nous reporterons donc cela à la prochaine fois. Autrement dit, la tâche du JRTB-10 n’est pas complètement terminée : nous la compléterons dans le prochain article. En même temps, j'ajouterai toutes les modifications qui existent déjà au bot principal. Vous souhaitez soutenir l'auteur, mais vous ne savez pas comment ? C'est très simple - abonnez-vous à ma chaîne tg , à mon compte GitHub et écrivez votre opinion à leur sujet dans des articles ici. Ces commentaires sont importants pour moi, je comprends donc qu'ils les lisent et qu'ils s'y intéressent.

conclusions

Résumons ce que nous avons vécu aujourd'hui :
  1. Nous avons expliqué comment ajouter votre propre annotation et comment elle peut être utilisée comme marqueur pour délimiter les rôles dans les équipes. D'ailleurs, cela aurait pu être fait en utilisant l'interface. De la même manière, nous créerions une interface de marqueur puis vérifierions si l'objet qui arrive implémente cette interface ou non.
  2. Ajout de la commande d'aide pour les administrateurs. Quant à moi, c’est aussi une partie importante dans le développement de ce bot.
  3. Nous avons expliqué comment ajouter une description et une fenêtre contextuelle de commandes lors de leur écriture dans un bot. Fonctionnalité intéressante, qui mérite vraiment d'être ajoutée.
Sur la base de cet article, j'ai créé une pull request , vous pouvez voir ses détails. Merci à tous pour votre attention, comme d'habitude : likez - abonnez-vous - cloche , star pour notre projet, commentez et notez l'article ! Rendez-vous dans le prochain article !

Une liste de tous les matériaux de la série se trouve au début de cet article.

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