JavaRush /Java-Blog /Random-DE /Wir fügen für ihn die Möglichkeit hinzu, als Administrato...

Wir fügen für ihn die Möglichkeit hinzu, als Administrator und Statistik zu arbeiten – „Java-Projekt von A bis Z“

Veröffentlicht in der Gruppe Random-DE
Hallo zusammen, meine lieben Freunde. Der Bot arbeitet also bereits und sendet Benachrichtigungen über neue Artikel. Wenn Sie es noch nicht verwenden, finden Sie hier den Link: Javarush Telegram Bot . Nun, heute sprechen wir über das Hinzufügen von Befehlen, die nur für Administratoren funktionieren. Einer dieser Befehle ist „Statistics and Help Board“. Warum ist das notwendig? Im Moment ist es interessanter, die Arbeit mit Anmerkungen im Rahmen dieser Aufgabe zu beschreiben, als der tatsächliche Bedarf dafür. „Java-Projekt von A bis Z“: Hinzufügen der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn – 1Nun, da wir zum Statistikteam gehen, können wir es erweitern und informativer gestalten. Nach dem MVP wird es beispielsweise möglich sein, Statistiken für Autoren zurückzugeben. Aber dazu später mehr...)

Lassen Sie uns das Hinzufügen von Administratoren und Befehlen für sie verstehen

Wir beginnen unsere Arbeit, indem wir den Hauptzweig aktualisieren und darauf basierend einen neuen erstellen – STEP_9_JRTB-10. Um herauszufinden, welcher Befehl für Administratoren und welcher für alle gilt, müssen Sie das Team kennzeichnen. Erstellen wir dazu eine Anmerkung. Was bedeutet das? Das haben wir noch nie gemacht. Dies kann beim Erstellen einer Klasse in IDEA ausgewählt werden. Ich werde es dir jetzt zeigen. Erstellen Sie im Befehlspaket ein neues Annotationspaket und darin die AdminCommand-Annotation: „Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 2Die Annotation selbst sieht folgendermaßen aus:
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 {
}
Mehr brauchen wir hier nicht. Als nächstes fügen wir es unserem StatCommand-Befehl hinzu: „Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 3Jetzt sollte alles funktionieren ... Oder nicht? Nein, natürlich)) Wir müssen unserem CommandContainer beibringen, das Ergebnis korrekt zu erzeugen. Dazu aktualisieren wir die Methode „retrieCommand“ , die einen auszuführenden Befehl ausgibt, je nachdem, was an sie übergeben wird. Wir werden seinen Benutzernamen in Telegram als Admin-ID verwenden. Es ist eindeutig und einfacher zu lesen als chat_id. Wie bekomme ich es? Es befindet sich im Update-Objekt und enthält die folgende Meldung:
update.getMessage().getFrom().getUserName()
Fassen wir das oben Gesagte zusammen und aktualisieren wir die Methode „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));
}
Wie Sie hier sehen können, habe ich die Methode isAdminCommand hinzugefügt , die prüft, ob für den bereitgestellten Befehl eine AdminCommand-Anmerkung vorhanden ist. Und wenn es sich um einen reinen Administratorbefehl handelt, prüfen wir, ob wir diesen Benutzernamen in unserer Sammlung verfügbarer Administratoren haben. Hier ist es übrigens, OOP, in seiner ganzen Pracht: Wir übergeben einfach eine Schnittstelle, die eine beliebige Implementierung sein kann. Wir können jedoch nur die Klasse übergeben, die die Befehlsschnittstelle implementiert . Und alles scheint klar zu sein, bis auf eines: Woher kamen die Admins? Ich werde es dir jetzt zeigen. Im Moment möchte ich admins als Umgebungsvariable übergeben, damit es einfach konfiguriert werden kann. Diese Variable enthält eine Zeile, in der alle Benutzernamen der Telegram-Benutzer, die Administratoren sein werden, durch Kommas getrennt angegeben werden. Fügen Sie dazu zu application.properties Folgendes hinzu:
bot.admins: robeskman,romankh3
Im CommandContainer-Konstruktor übergeben wir die Sammlung von Administratoren und initialisieren sie:
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;
Und bereits in JavaRushTelegramBot gibt es die ganze Magie, eine Sammlung aus einem String in Eigenschaften zu erhalten:
@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);
}
Wie Sie dem obigen Konstruktor entnehmen können, verwenden wir erneut die Value- Annotation , in die wir die Logik zum Erstellen der Sammlung übergeben. Und das ist alles, das Hinzufügen des Administrators ist vorbei. Wenn nun ein Nicht-Administrator Daten zu den Statistiken des Bots erhalten möchte, erhält er die folgende Antwort: Ich verstehe Sie nicht 😟, schreiben Sie /help, um herauszufinden, was ich verstehe. Auf diese Weise haben wir die Rollen für die Bot-Befehle differenziert.

Hinzufügen eines Hilfebefehls für Administratoren

Als nächstes wäre es logisch, einen separaten Hilfebefehl für Administratoren zu erstellen . In Zukunft könnte dieser Teil deutlich wachsen. Fügen Sie den Admin- Hilfewert zum CommandName hinzu:
ADMIN_HELP("/ahelp")
Erstellen Sie die AdminHelpCommand -Klasse im Befehlspaket:
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);
   }
}
Bisher ist es sehr einfach. Es kann durchaus sein, dass es in Zukunft recht gut wächst. Für diesen Befehl ein Test aus unserer Vorlage:
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);
   }
}
Natürlich muss der Befehl zum CommandContainer in unserer Map hinzugefügt werden:
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

Hinzufügen einer Beschreibung der Befehle zum Bot

Telegram-Bots verfügen über eine weitere interessante Funktion: Sie können Werte und Beschreibungen der akzeptierten Befehle hinzufügen, um dem Benutzer die Verwendung der Befehle zu erleichtern. Wie sieht es aus? Nehmen wir als Beispiel BotFather – den wichtigsten Telegram-Bot. Wenn Sie mit dem Schreiben einer Nachricht mit einem Schrägstrich / beginnen, bietet der Bot Optionen an: „Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 4Und wenn Sie mit dem Schreiben fortfahren, filtert er relevante Optionen und zeigt sie an: „Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 5Coole Funktionalität, oder? Deshalb möchte ich hier dasselbe tun. Ich werde es so gut wie möglich machen – über die Telegram-Anwendung. Ich weiß, dass dies programmgesteuert möglich ist. Aber ich kann nicht. Dies ist für die Zwecke dieser Artikelserie nicht erforderlich. Wenn jemand weiß, wie das geht, schreiben Sie mir, wir werden es hinzufügen. Gerne nehme ich dabei jede Hilfe entgegen. Ich habe einmal gelesen, dass dies über das für uns funktionierende Befehlsmuster erfolgen kann. Jetzt zeige ich Ihnen, wie ich das machen kann: Wir müssen BotFather in Telegram finden und den Bot auswählen, den wir konfigurieren möchten. Wählen Sie als Nächstes die Bearbeitung des Bots und den Abschnitt über Befehle aus. Jetzt zeige ich alles am Beispiel meines Testbots für Javarush. Bei BotFather schreiben wir den Befehl: /mybots„Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 6 Als nächstes wählen wir den Bot aus, den wir brauchen, in meinem Fall wird es test_javarush_community_bot sein: „Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 7Wie Sie in der Liste der Schaltflächen sehen können, können Sie hier den Token anzeigen, den Bot löschen und ihn übertragen jemand anderes. Wir sind daran interessiert, den Bot zu bearbeiten, also wählen wir Edit Bot : „Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 8Und hier wählen wir Edit Commands : „Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 9Wir müssen nur eine Nachricht in einem bestimmten Format bereitstellen, und sie wird als Befehle aufgezeichnet. Oder wenn wir sie alle entfernen möchten, schreiben Sie /empty. Zu diesem Zweck erstelle ich eine Datei im Stammverzeichnis des Projekts SET_UP_COMMANDS_BOT_FATHER , in die ich alle unsere Befehle schreibe, damit sie im Falle eines Problems einfach wiederhergestellt oder aktualisiert werden können. SET_UP_COMMANDS_BOT_FATHER:
start – Arbeit mit dem Bot starten/wiederherstellen stop – Arbeit mit dem Bot pausieren addGroupSub – eine Artikelgruppe abonnieren deleteGroupSub – von einer Artikelgruppe abmelden listGroupSub – Liste der Gruppen, bei denen Sie abonniert sind Hilfe – Holen Sie sich Hilfe bei der Zusammenarbeit mit mir
Es ist klar, dass wir hier keine Admin-Befehle ausführen. Nur Administratoren sollten davon wissen. Nehmen wir diese Nachricht und geben sie an BotFather weiter: „Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 10Wie so oft hat es beim ersten Mal nicht geklappt. Nach einigen Minuten des Nachdenkens übergab ich alle Befehle in Kleinbuchstaben und nicht wie zuvor in CamelCase, und alles lief gut. Wir aktualisieren in unserer Datei: SET_UP_COMMANDS_BOT_FATHER:
start – Arbeit mit dem Bot starten/wiederherstellen stop – Arbeit mit dem Bot pausieren addgroupsub – eine Artikelgruppe abonnieren deletegroupsub – von einer Artikelgruppe abmelden listgroupsub – Liste der Gruppen, bei denen Sie abonniert sind Hilfe – Holen Sie sich Hilfe bei der Arbeit mit mir
Jetzt können Sie zu unserem Bot gehen und sehen, ob die Befehle automatisch geladen wurden: „Java-Projekt von A bis Z“: Hinzufügung der Möglichkeit, als Administrator zu arbeiten, und Statistiken für ihn.  Teil 1 - 11Schauen Sie, wie schön es jetzt ist! Ich wollte im Rahmen dieses Artikels auch die Funktionalität der Statistik erweitern, aber der Stoff war sowohl inhaltlich als auch inhaltlich bereits umfangreich. Daher werden wir dies auf das nächste Mal verschieben. Das heißt, die Aufgabe von JRTB-10 ist noch nicht vollständig erledigt: Wir werden sie im nächsten Artikel abschließen. Gleichzeitig werde ich alle Änderungen, die bereits vorhanden sind, zum Hauptbot hinzufügen. Sie möchten den Autor unterstützen, wissen aber nicht wie? Es ist ganz einfach – abonnieren Sie meinen tg-Kanal , meinen GitHub-Account und schreiben Sie Ihre Meinung dazu in den Artikeln hier. Dieses Feedback ist mir wichtig, daher verstehe ich, dass sie gelesen werden und sich für sie interessieren.

Schlussfolgerungen

Fassen wir zusammen, was wir heute durchgemacht haben:
  1. Wir haben besprochen, wie Sie Ihre eigene Anmerkung hinzufügen und wie diese als Markierung zur Abgrenzung von Rollen in Teams verwendet werden kann. Dies hätte übrigens auch über die Schnittstelle erfolgen können. Auf die gleiche Weise würden wir eine Markierungsschnittstelle erstellen und dann prüfen, ob das ankommende Objekt diese Schnittstelle implementiert oder nicht.
  2. Hilfebefehl für Administratoren hinzugefügt. Für mich ist dies auch ein wichtiger Teil bei der Entwicklung dieses Bots.
  3. Wir haben besprochen, wie man beim Schreiben in einem Bot eine Beschreibung und ein Popup von Befehlen hinzufügt. Interessantes Feature, das auf jeden Fall eine Ergänzung wert ist.
Basierend auf diesem Artikel habe ich eine Pull-Anfrage erstellt . Sie können die Details sehen. Vielen Dank an alle für Ihre Aufmerksamkeit, wie immer: Liken – Abonnieren – Klingeln , Sternchen für unser Projekt, Kommentieren und Bewerten des Artikels! Wir sehen uns im nächsten Artikel!

Eine Liste aller Materialien der Serie finden Sie am Anfang dieses Artikels.

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