TelegramBot. La fonctionnalité de base. Autocollants et émoticônes. (Partie 3)

L'une des questions qui revient souvent dans les MP est de savoir comment travailler avec des sourires (emojis) et des autocollants.

Comment travailler avec eux, quels outils j'utilise, etc.

Dans cette partie, nous considérerons de telles choses: comment créer un message avec un autocollant, comment traiter un message reçu avec un autocollant, comment trouver toutes les émoticônes (emoji) dans le texte du message, comment créer un message à l'aide d'émoticônes.

Peu importe, s'il vous plaît, sous le chat.

Par tradition, nous commençons l'article avec un lien vers la source :)

Tout le code discuté dans l'article est compilé dans la branche Part3-Stick_and_Emoji .

Autocollants


L'une des choses que j'aimais tant dans le télégramme dès qu'il est apparu était les autocollants. Ils sont cool, confortables, gratuits. Et toute cette grande variété d'autocollants que nous voulons naturellement utiliser dans le bot. En fait, cette procédure est très simple. Pour envoyer un autocollant à un utilisateur, il suffit de connaître l'identifiant de l'autocollant et rien d'autre.
Habituellement, pour les autocollants, je crée moi-même une telle classe d'assistant, où je stocke des données sur les autocollants utilisés dans le bot:

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; } } 

Ici, tout est simple. Nous donnons à l'autocollant un nom qui nous est compréhensible. Et avec quelques méthodes, nous obtenons un objet prêt à l'emploi pour l'envoi à l'utilisateur.

Afin de répondre à la question: «Où puis-je obtenir l'ID de l'autocollant?», Écrivons-nous un assistant qui nous fournira ces données dans notre bot.

Nous avons les fonctionnalités de base que nous avons créées ici:
TelegramBot. La fonctionnalité de base. (2e partie)
Pour que notre robot commence à traiter les autocollants acceptés, nous avons besoin de:

  • Déterminez qu'ils nous ont envoyé un autocollant
  • Indiquez quel gestionnaire est responsable du traitement des messages avec des autocollants
  • Exécutez un gestionnaire qui générera un message à l'utilisateur en réponse

Tâche : lors de la réception d'un autocollant dans le chat, le bot doit envoyer un message texte avec l'ID de l'autocollant en réponse.

Nous avons ajouté la commande STICKER à la liste des commandes

Dans l'analyseur de la mise à jour envoyée, nous allons essayer de déterminer si nous avons un SMS ou s'il contient un autocollant:

MessageReciever.java ligne 57

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

Parce que nous n'avons pas besoin de faire un traitement complexe du message envoyé, alors nous confierons le traitement des messages contenant l'autocollant au gestionnaire existant chargé de gérer les soi-disant «messages système»:
MessageReciever.java ligne 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; 

En conséquence, dans SystemHandler, nous devons spécifier comment traiter la commande STICKER reçue:
SystemHandler.java ligne 31

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

En conséquence, lors de l'envoi de tout autocollant à notre bot, nous recevrons son ID en réponse:



Émoticônes ou Emoji


Ils ont été standardisés, presque tous les appareils et systèmes d'exploitation les comprennent et sont capables de les afficher. Ils sont très pratiques à utiliser pour décorer les messages. Ils regardent succinctement les boutons sous les messages. Qu'on le veuille ou non - certains avantages.

Par exemple, dans le bot du planificateur d'événements



En utilisant les mêmes icônes sur les boutons et dans le texte du message, vous permettez à l'utilisateur de comprendre intuitivement et votre interface, encombrant le message et les boutons avec un excès de texte.

Pour afficher les emojis dans un message ou sur un bouton, vous devez connaître son Unicode. Internet regorge de sources où vous pouvez trouver toutes les émoticônes listées, où leurs balises, codes sont indiqués.
Pour ma part, j'ai choisi cette façon de travailler avec les émojis: il est plus pratique de regarder et de sélectionner des émoticônes dans le télégramme lui-même.

Eh bien, bien sûr, par analogie avec les autocollants, écrivons un petit assistant pour nous qui nous montrera les codes nécessaires et même si nous sommes garantis de les traiter correctement.

Tout d'abord, ajoutez la dépendance suivante à pom.xml :

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

Honnêtement, je ne me souviens pas d'où je l'ai rencontré, mais depuis lors je ne l'utilise que si j'ai besoin de faire quelque chose avec des émoticônes dans mon bot.

La bibliothèque contient de nombreux outils différents:



Curieux et curieux seront où se retourner :)

Que faut-il pour envoyer une émoticône à l'aide d'un bot? Vous devez incorporer les emoji souhaités dans le texte du message Unicode.

Oui, vous pouvez trouver des ressources qui donnent des listes Unicode avec des emojis, montrent différents tableaux récapitulatifs de l'apparence des émoticônes sur différents smartphones.

Je veux vous montrer un moyen qui s'est avéré être le plus pratique pour travailler avec des sourires pour moi.

Voyons d'abord comment utiliser les sourires dans le télégramme lui-même. Vous pouvez appeler une boîte de dialogue où toutes les émoticônes sont répertoriées et les ajouter au message, simplement en cliquant sur leurs icônes. Des émoticônes peuvent également être ajoutées au message à l'aide de balises.

Les balises doivent être encadrées de deux points et contenir une sorte de texte unique indiquant le smiley souhaité.

Si dans le champ de saisie d'un message vous commencez à taper un message commençant par deux points, le télégramme lui-même commencera à montrer quels emojis contiennent le texte saisi de la balise:



Et lorsque vous entrez la bonne balise d'émoticône et mettez un autre deux-points - le texte se transformera en un smiley. Les balises sont également affichées si vous maintenez le bouton gauche de la souris sur l'émoticône.



Et maintenant, la bibliothèque vient à notre aide, dont nous avons ajouté la dépendance ci-dessus. Elle sait comment travailler avec des balises d'émoticônes. Ceci est pratique principalement pour vous, car les balises sont plus lisibles, elles ont une sorte de sens.

Et nous, connaissant la balise, pouvons obtenir l'émoticône Unicode comme ceci:

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

Vous pouvez vous faire une classe séparée dans laquelle vous garderez les émoticônes que vous utilisez dans le bot. Sur l'exemple du même planificateur d'événements , il a ces sourires dans son 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; } } 

Et voici à quoi ressemblera le code en utilisant cette classe et une émoticône spécifique:

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

Voici le code de ce bouton:



J'ai remarqué une nuance de cette bibliothèque. Toutes les émoticônes contenues dans un télégramme ne peuvent pas être reconnues par la bibliothèque. Par conséquent, faites attention aux nouvelles versions de la bibliothèque.

Eh bien, pour savoir exactement quels sourires nous pouvons montrer et lesquels non, nous confierons cette tâche à notre assistante.

Tâche: si le message envoyé ne contient aucune commande spécifique, mais contient des sourires dans le texte, affichez ces sourires à l'écran sous forme de message à l'utilisateur et indiquez leurs attributs (balise et description).

Ajoutez la commande TEXT_CONTAIN_EMOJI à la liste des commandes
Command.java ligne 8

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

Dans l'analyseur qui détermine le type de commande contenu dans notre message, ajoutez le texte suivant:

Parser.java ligne 38

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

Si nous déterminons que le message ne contient aucune commande spécifique, mais qu'il contient des émoticônes, nous renvoyons que nous avons analysé la commande TEXT_CONTAIN_EMOJI.

Créez un gestionnaire distinct qui ne traitera que cette commande:
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(); } } 

Ce code sélectionne uniquement les émoticônes dans le texte du message, forme un ensemble avec des émoticônes uniques, sélectionne les balises et la description de leurs propriétés et génère un message texte à partir de cela.

Le résultat du travail ressemble à ceci:



Entre crochets, nous obtenons des balises que nous pouvons utiliser pour insérer des émoticônes. Vous pouvez voir que plus d'une balise fait parfois référence à une émoticône.

Et aussi, avec l'aide de cet assistant, nous pouvons comprendre précisément quelles émoticônes notre bibliothèque comprend et lesquelles elle ignore.

Comme, par exemple, vous pouvez voir ici:



Souriez avec le code : face_with_monocle: pour une raison quelconque, il n'est pas détecté par cette bibliothèque.

Nous avons donc un gestionnaire. Comment lui passer la tâche?

Parce que nous savons déjà qu'un message texte contenant des émoticônes est détecté en tant que commande TEXT_CONTAIN_EMOJI - dans MessageReciever, nous devons indiquer qu'un gestionnaire EmojiHandler distinct est responsable du traitement de cette commande.

MessageReciever.java ligne 94

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

Programmez avec plaisir et n'hésitez pas à poser des questions :)

PS
Vous pouvez sentir le bot avec cette fonctionnalité ici: https://t.me/test_habr_bot .

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


All Articles