TelegramBot. Die Grundfunktionalität. Aufkleber und Emoticons. (Teil 3)

Eine der Fragen, die in PM häufig gestellt werden, ist, wie mit Lächeln (Emojis) und Aufklebern gearbeitet wird.

Wie man damit arbeitet, welche Tools ich benutze, etc.

In diesem Teil werden wir solche Dinge betrachten: wie man eine Nachricht mit einem Sticker erstellt, wie man eine empfangene Nachricht mit einem Sticker verarbeitet, wie man alle Emoticons (Emoji) im Nachrichtentext findet, wie man eine Nachricht mit Emoticons erstellt.

Wen kümmert es, bitte, unter der Katze.

Aus Tradition beginnen wir den Artikel mit einem Link zur Quelle dafür :)

Der gesamte im Artikel beschriebene Code wird im Zweig Part3-Stick_and_Emoji kompiliert.

Aufkleber


Eines der Dinge, die mir im Telegramm so gut gefallen haben, als es erschien, waren Aufkleber. Sie sind cool, bequem, frei. Und all diese Vielzahl von Aufklebern, die wir natürlich im Bot verwenden möchten. In der Tat ist dieses Verfahren sehr einfach. Um einem Benutzer einen Aufkleber zu senden, müssen wir nur die ID des Aufklebers kennen und sonst nichts.
Normalerweise erstelle ich mir für Sticker eine solche Assistenzklasse, in der ich Daten über die im Bot verwendeten Sticker speichere:

Stickers.java

import org.telegram.telegrambots.api.methods.send.SendSticker; public enum Stickers { FUNNY_JIM_CARREY("CAADBQADiQMAAukKyAPZH7wCI2BwFxYE"), ; String stickerId; Stickers(String stickerId) { this.stickerId = stickerId; } public SendSticker getSendSticker(String chatId) { if ("".equals(chatId)) throw new IllegalArgumentException("ChatId cant be null"); SendSticker sendSticker = getSendSticker(); sendSticker.setChatId(chatId); return sendSticker; } public SendSticker getSendSticker() { SendSticker sendSticker = new SendSticker(); sendSticker.setSticker(stickerId); return sendSticker; } } 

Hier ist alles einfach. Wir geben dem Aufkleber einen für uns verständlichen Namen. Und mit Hilfe einiger Methoden erhalten wir ein fertiges Objekt zum Versenden an den Benutzer.

Um die Frage zu beantworten: „Woher bekomme ich die Sticker-ID?“, Schreiben wir einen Assistenten, der uns diese Daten in unserem Bot zur Verfügung stellt.

Wir haben die grundlegenden Funktionen, die wir hier erstellt haben:
TelegramBot. Die Grundfunktionalität. (Teil 2)
Damit unser Bot die akzeptierten Aufkleber irgendwie verarbeiten kann, benötigen wir:

  • Stellen Sie fest, dass sie uns einen Aufkleber geschickt haben
  • Geben Sie an, welcher Handler für die Verarbeitung von Nachrichten mit Aufklebern verantwortlich ist
  • Führen Sie einen Handler aus, der als Antwort eine Nachricht an den Benutzer generiert

Aufgabe : Beim Empfang eines Aufklebers im Chat sollte der Bot eine Textnachricht mit der Aufkleber-ID als Antwort senden.

Wir haben den Befehl STICKER zur Liste der Befehle hinzugefügt

Im Analyzer des gesendeten Updates werden wir versuchen festzustellen, ob wir eine Textnachricht haben oder ob sie einen Aufkleber enthält:

MessageReciever.java Zeile 57

  if (message.hasText()) { parsedCommand = parser.getParsedCommand(message.getText()); } else { Sticker sticker = message.getSticker(); if (sticker != null) { parsedCommand = new ParsedCommand(Command.STICKER, sticker.getFileId()); } } 

Weil Wir müssen keine komplexe Verarbeitung der gesendeten Nachricht vornehmen. Dann werden wir die Verarbeitung der Nachrichten mit dem Aufkleber dem vorhandenen Handler anvertrauen, der für die Verarbeitung der sogenannten "Systemnachrichten" verantwortlich ist:
MessageReciever.java Zeile 86

  case START: case HELP: case ID: case STICKER: SystemHandler systemHandler = new SystemHandler(bot); log.info("Handler for command[" + command.toString() + "] is: " + systemHandler); return systemHandler; 

Dementsprechend müssen wir in SystemHandler angeben, wie der empfangene STICKER- Befehl verarbeitet werden soll:
SystemHandler.java Zeile 31

  case STICKER: return "StickerID: " + parsedCommand.getText(); 

Als Ergebnis erhalten wir beim Senden eines Aufklebers an unseren Bot die ID als Antwort:



Emoticons oder Emoji


Sie waren standardisiert, fast alle Geräte und Betriebssysteme verstehen und können sie anzeigen. Sie sind sehr praktisch, um Nachrichten zu dekorieren. Sie sehen kurz und bündig auf den Schaltflächen unter den Nachrichten. Ob es Ihnen gefällt oder nicht - einige Vorteile.

Zum Beispiel im Event Scheduler Bot



Mithilfe der gleichen Symbole auf den Schaltflächen und im Text der Nachricht können Sie dem Benutzer ermöglichen, Ihre Benutzeroberfläche intuitiv und verständlich zu gestalten und die Nachricht und die Schaltflächen mit überschüssigem Text zu überfüllen.

Um Emojis in einer Nachricht oder auf einer Schaltfläche anzuzeigen, müssen Sie deren Unicode kennen. Das Internet ist voll von Quellen, in denen Sie alle aufgelisteten Emoticons finden, deren Tags und Codes angezeigt werden.
Für mich selbst habe ich diese Art der Arbeit mit Emojis gewählt: Es ist bequemer, Emoticons im Telegramm selbst zu sehen und auszuwählen.

Nun, natürlich, analog zu den Aufklebern, schreiben wir einen kleinen Helfer für uns, der uns die notwendigen Codes zeigt und auch, damit wir sie garantiert korrekt verarbeiten können.

Fügen Sie zuallererst die folgende Abhängigkeit zu pom.xml hinzu :

  <dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-java</artifactId> <version>3.3.0</version> </dependency> 

Ehrlich gesagt, ich kann mich nicht erinnern, wo ich darauf gestoßen bin, aber seitdem benutze ich es nur, wenn ich etwas mit Emoticons in meinem Bot machen muss.

Die Bibliothek enthält viele verschiedene Tools:



Neugierig und neugierig wird sein, wo man sich umdrehen kann :)

Was braucht es, um ein Emoticon mit einem Bot zu senden? Sie müssen das gewünschte Emoji in den Text der Unicode-Nachricht einbetten.

Ja, Sie können Ressourcen finden, die Unicode-Listen mit Emojis enthalten, und verschiedene Übersichtstabellen darüber anzeigen, wie Emoticons auf verschiedenen Smartphones aussehen.

Ich möchte Ihnen einen Weg zeigen, der sich für mich als der geeignetste herausgestellt hat, mit einem Lächeln umzugehen.

Lassen Sie uns zunächst sehen, wie Sie Lächeln im Telegramm selbst verwenden können. Sie können ein Dialogfeld aufrufen, in dem alle Emoticons aufgelistet sind, und sie der Nachricht hinzufügen, indem Sie einfach auf die entsprechenden Symbole klicken. Emoticons können der Nachricht auch mithilfe von Tags hinzugefügt werden.

Tags sollten mit Doppelpunkten umrahmt sein und einen eindeutigen Text enthalten, der den gewünschten Smiley angibt.

Wenn Sie in das Feld für die Eingabe einer Nachricht eine Nachricht eingeben, die mit einem Doppelpunkt beginnt, zeigt das Telegramm selbst an, welche Emojis den eingegebenen Text des Tags enthalten:



Und wenn Sie das richtige Emoticon-Tag eingeben und einen weiteren Doppelpunkt einfügen, verwandelt sich der Text in einen Smiley. Tags werden auch angezeigt, wenn Sie die linke Maustaste auf dem Emoticon gedrückt halten.



Und jetzt kommt uns die Bibliothek zu Hilfe, deren Abhängigkeit wir oben hinzugefügt haben. Sie weiß, wie man mit Emoticon-Tags arbeitet. Dies ist in erster Linie für Sie von Vorteil, da Tags besser lesbar sind und eine Bedeutung haben.

Und wenn wir das Tag kennen, können wir das Unicode-Emoticon folgendermaßen erhalten:

 String emoji_kissing = EmojiParser.parseToUnicode(":kissing:"); 

Sie können sich eine separate Klasse erstellen, in der Sie die im Bot verwendeten Emoticons behalten. Am Beispiel desselben Veranstaltungsplaners hat er dieses Lächeln in seinem Arsenal:

 import com.vdurmont.emoji.EmojiParser; public enum Icon { PLUS(":heavy_plus_sign:"), MINUS(":heavy_minus_sign:"), CHECK(":white_check_mark:"), NOT(":x:"), DOUBT(":zzz:"), FLAG(":checkered_flag:") private String value; public String get() { return EmojiParser.parseToUnicode(value); } Icon(String value) { this.value = value; } } 

Und so sieht der Code mit dieser Klasse und einem bestimmten Emoticon aus:

  row.add(new InlineKeyboardButton() .setText(Icon.CHECK.get() + " I'm going") 

Dies ist der Code für diese Schaltfläche:



Ich habe eine Nuance dieser Bibliothek bemerkt. Nicht alle Emoticons, die sich in einem Telegramm befinden, können die Bibliothek erkennen. Achten Sie daher auf neue Versionen der Bibliothek.

Um sicherzugehen, welches Lächeln wir zeigen können und welches nicht, werden wir diese Aufgabe unserem Assistenten anvertrauen.

Aufgabe: Wenn die gesendete Nachricht keinen bestimmten Befehl enthält, aber Emoticons im Text enthält, zeigen Sie diese Emoticons dem Benutzer auf dem Bildschirm in Form einer Nachricht an und geben Sie deren Attribute (Tag und Beschreibung) an.

Fügen Sie der Befehlsliste den Befehl TEXT_CONTAIN_EMOJI hinzu
Command.java Zeile 8

 public enum Command { ... TEXT_CONTAIN_EMOJI, ... } 

Fügen Sie im Parser, der bestimmt, welche Art von Befehl in unserer Nachricht enthalten ist, den folgenden Text hinzu:

Parser.java Zeile 38

  if (result.getCommand() == Command.NONE) { List<String> emojiContainsInText = EmojiParser.extractEmojis(result.getText()); if (emojiContainsInText.size() > 0) result.setCommand(Command.TEXT_CONTAIN_EMOJI); } 

Wenn wir feststellen, dass die Nachricht keinen bestimmten Befehl enthält, sich jedoch Emoticons darin befinden, geben wir zurück, dass wir den Befehl TEXT_CONTAIN_EMOJI analysiert haben.

Erstellen Sie einen separaten Handler, der nur diesen Befehl verarbeitet:
EmojiHandler.java

 import com.example.telegrambot.bot.Bot; import com.example.telegrambot.command.ParsedCommand; import com.vdurmont.emoji.Emoji; import com.vdurmont.emoji.EmojiManager; import com.vdurmont.emoji.EmojiParser; import org.apache.log4j.Logger; import org.telegram.telegrambots.api.objects.Update; import java.util.HashSet; import java.util.Set; public class EmojiHandler extends AbstractHandler { private static final Logger log = Logger.getLogger(EmojiHandler.class); public EmojiHandler(Bot bot) { super(bot); } @Override public String operate(String chatId, ParsedCommand parsedCommand, Update update) { String text = parsedCommand.getText(); StringBuilder result = new StringBuilder(); Set<String> emojisInTextUnique = new HashSet<>(EmojiParser.extractEmojis(text)); if (emojisInTextUnique.size() > 0) result.append("Parsed emojies from message:").append("\n"); for (String emojiUnicode : emojisInTextUnique) { Emoji byUnicode = EmojiManager.getByUnicode(emojiUnicode); log.debug(byUnicode.toString()); String emoji = byUnicode.getUnicode() + " " + byUnicode.getAliases() + " " + byUnicode.getDescription(); result.append(emoji).append("\n"); } return result.toString(); } } 

Dieser Code wählt nur Emoticons aus dem Nachrichtentext aus, bildet eine Gruppe mit eindeutigen, wählt Tags und Beschreibungen aus ihren Eigenschaften aus und generiert daraus eine Textnachricht.

Das Ergebnis der Arbeit sieht so aus:



In eckigen Klammern erhalten wir Tags, mit denen wir Emoticons einfügen können. Sie können sehen, dass sich mehr als ein Tag manchmal auf ein Emoticon bezieht.

Mithilfe dieses Assistenten können wir außerdem genau nachvollziehen, welche Emoticons unsere Bibliothek versteht und welche ignoriert.

Wie Sie zum Beispiel hier sehen können:



Lächle mit dem Code : face_with_monocle: aus irgendeinem Grund wird es von dieser Bibliothek nicht erkannt.

Also haben wir einen Handler. Wie geben wir die Aufgabe an ihn weiter?

Weil Wir wissen bereits, dass eine Textnachricht mit Emoticons als TEXT_CONTAIN_EMOJI-Befehl erkannt wird. In MessageReciever müssen wir angeben, dass ein separater EmojiHandler-Handler für die Verarbeitung dieses Befehls verantwortlich ist.

MessageReciever.java Zeile 94

  case TEXT_CONTAIN_EMOJI: EmojiHandler emojiHandler = new EmojiHandler(bot); log.info("Handler for command[" + command.toString() + "] is: " + emojiHandler); return emojiHandler; 

Programmieren Sie gerne und zögern Sie nicht, Fragen zu stellen :)

PS
Sie können den Bot mit dieser Funktionalität hier fühlen: https://t.me/test_habr_bot .

Source: https://habr.com/ru/post/de482260/


All Articles