واحدة من الأسئلة التي غالبا ما تأتي في PM هو كيفية العمل مع الابتسامات (الرموز التعبيرية) والملصقات.
كيفية العمل معهم ، ما هي الأدوات التي أستخدمها ، إلخ.
في هذا الجزء ، سننظر في مثل هذه الأمور: كيفية إنشاء رسالة باستخدام ملصق ، وكيفية معالجة رسالة مستلمة مع ملصق ، وكيفية العثور على جميع الرموز (الرموز التعبيرية) في نص الرسالة ، وكيفية إنشاء رسالة باستخدام الرموز.
من يهتم ، من فضلك ، تحت القط.
حسب التقاليد ، نبدأ المقال مع رابط للمصدر لأنه :)
يتم تجميع كافة التعليمات البرمجية التي تمت مناقشتها في المقالة في
الفرع Part3-Stick_and_Emoji .
ملصقات
واحدة من الأشياء التي أعجبتني كثيرًا في البرق بمجرد ظهورها هي الملصقات. أنها باردة ومريحة وخالية. وكل هذه المجموعة الضخمة من الملصقات التي نريد استخدامها بشكل طبيعي في الروبوت. في الواقع ، هذا الإجراء بسيط جدا. لإرسال ملصق إلى أحد المستخدمين ، نحتاج فقط إلى معرفة هوية الملصق وأي شيء آخر.
عادةً ما يتعلق بالملصقات ، أقوم بإنشاء فئة مساعدين بنفسي ، حيث أقوم بتخزين البيانات حول الملصقات المستخدمة في الروبوت:
Stickers.javaimport 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; } }
كل شيء بسيط هنا. نعطي الملصق اسمًا مفهومًا لنا. وبمساعدة من طريقتين نحصل على كائن جاهز للإرسال إلى المستخدم.
للإجابة على السؤال: "من أين يمكنني الحصول على معرف الملصق؟" ، - دعنا نكتب مساعدًا سيقدم لنا هذه البيانات في روبوتنا.
لدينا الوظائف الأساسية التي أنشأناها هنا:
TelegramBot. الوظائف الأساسية. (الجزء 2)لكي يبدأ الروبوت الخاص بنا في معالجة الملصقات المقبولة بطريقة ما ، نحتاج إلى:
- تحديد أنهم أرسلوا لنا ملصقا
- حدد أي معالج مسؤول عن معالجة الرسائل باستخدام الملصقات
- قم بتشغيل معالج يقوم بإنشاء رسالة للمستخدم استجابةً لذلك
المهمة : عند تلقي ملصق في الدردشة ، يجب أن يرسل الروبوت رسالة نصية بها معرف الملصق استجابةً لذلك.
أضفنا الأمر
STICKER إلى قائمة الأوامر
في محلل التحديث الذي تم إرساله ، سنحاول تحديد ما إذا كانت لدينا رسالة نصية أم أنها تحتوي على ملصق:
MessageReciever.java سطر 57 if (message.hasText()) { parsedCommand = parser.getParsedCommand(message.getText()); } else { Sticker sticker = message.getSticker(); if (sticker != null) { parsedCommand = new ParsedCommand(Command.STICKER, sticker.getFileId()); } }
لأن لسنا بحاجة إلى القيام بمعالجة معقدة للرسالة المرسلة ، فسنقوم بتكليف معالجة الرسائل التي تحتوي على الملصق إلى المعالج الحالي المسؤول عن معالجة ما يسمى "رسائل النظام":
MessageReciever.java سطر 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;
وفقًا لذلك ، في
SystemHandler نحتاج إلى تحديد كيفية معالجة أمر
STICKER الذي تم استلامه:
SystemHandler.java سطر 31 case STICKER: return "StickerID: " + parsedCommand.getText();
نتيجة لذلك ، عند إرسال أي لاصق إلى برنامج الروبوت الخاص بنا ، سوف نتلقى هويته ردًا على ذلك:

المشاعر أو الرموز التعبيرية
كانت موحدة ، وفهم جميع الأجهزة وأنظمة التشغيل تقريبا وقادرة على عرضها. أنها مريحة للغاية لاستخدامها لتزيين الرسائل. تبدو بإيجاز على الأزرار الموجودة أسفل الرسائل. شئنا أم أبينا - بعض المزايا.
على سبيل المثال ، في
بوت جدولة الحدث
باستخدام نفس الأيقونات على الأزرار وفي نص الرسالة ، تسمح للمستخدم بإدراك وفهم واجهتك ، مما يؤدي إلى تشويش الرسالة والأزرار بنص زائد.
لعرض الرموز التعبيرية في رسالة أو على زر ، تحتاج إلى معرفة يونيكود. الإنترنت مليء بالمصادر حيث يمكنك العثور على جميع الرموز المدرجة ، حيث تتم الإشارة إلى رموزها.
بالنسبة لي ، اخترت هذه الطريقة في العمل مع الرموز التعبيرية: إنه أكثر ملاءمة لمشاهدة واختيار الرموز في البرقية نفسها.
حسنًا ، بالطبع ، عن طريق القياس مع الملصقات ، فلنكتب مساعدًا صغيرًا لأنفسنا الذين سيظهرون لنا الرموز اللازمة وحتى نضمن معالجتها بشكل صحيح.
بادئ ذي بدء ، أضف التبعية التالية إلى
pom.xml :
<dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-java</artifactId> <version>3.3.0</version> </dependency>
بصراحة ، لا أتذكر المكان الذي صادفته ، لكنني منذ ذلك الحين لا أستخدمه إلا إذا احتجت إلى فعل شيء مع الرموز في روبوتي.
تحتوي المكتبة على العديد من الأدوات المختلفة:

سوف فضولي وفضولي يكون حيث يستدير :)
ما الذي يتطلبه الأمر لإرسال التعبيرات باستخدام الروبوت؟ تحتاج إلى تضمين الرموز التعبيرية المطلوبة في نص رسالة Unicode.
نعم ، يمكنك العثور على الموارد التي تعطي قوائم Unicode مع الرموز التعبيرية ، وتظهر جداول ملخص مختلفة لكيفية ظهور الرموز على الهواتف الذكية المختلفة.
أريد أن أوضح لك الطريقة التي أصبحت أكثر ملائمة للعمل مع الابتسامات من أجلي.
أولاً ، دعنا نرى كيف يمكنك استخدام الابتسامات في البرقية نفسها. يمكنك استدعاء مربع حوار حيث يتم سرد جميع الرموز وإضافتها إلى الرسالة ، ببساطة عن طريق النقر على أيقوناتها. يمكن أيضًا إضافة الرموز إلى الرسالة باستخدام العلامات.
يجب وضع العلامات في علامات نقطية وتحتوي على نوع من النص الفريد الذي يشير إلى الابتسامة المطلوبة.
إذا بدأت في حقل إدخال رسالة في كتابة رسالة تبدأ بنقطتين ، سيبدأ التلغراف نفسه في إظهار الرموز التعبيرية التي تحتوي على النص المدخل للعلامة:

وعندما تدخل علامة التعبيرات الصحيحة وتضع علامة القولون ، فإن النص سيتحول إلى ابتسامة. يتم أيضًا عرض العلامات إذا كنت تضغط على زر الماوس الأيسر على التعبيرات.

والآن تأتي المكتبة لمساعدتنا ، التي أضفناها أعلاه. إنها تعرف كيفية التعامل مع علامات التعبيرات. هذا مناسب لك في المقام الأول ، حيث أن العلامات أكثر قابلية للقراءة ، فهي تحمل نوعًا من المعنى.
ونحن ، معرفة العلامة ، يمكننا الحصول على التعبيرات الخاصة بـ Unicode مثل هذا:
String emoji_kissing = EmojiParser.parseToUnicode(":kissing:");
يمكنك أن تجعل نفسك فصلًا منفصلاً ستحتفظ فيه بالرموز التي تستخدمها في الروبوت. على سبيل المثال من
مخطط الحدث نفسه ، لديه هذه الابتسامات في ترسانته:
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; } }
وهذه هي الطريقة التي سيبدو بها الكود باستخدام هذه الفئة وشعور معين:
row.add(new InlineKeyboardButton() .setText(Icon.CHECK.get() + " I'm going")
هذا هو رمز هذا الزر:

لقد لاحظت فارق بسيط واحد من هذه المكتبة. ليست كل الرموز الموجودة في برقية ، يمكن للمكتبة التعرف عليها. لذلك ، احترس من الإصدارات الجديدة من المكتبة.
حسنًا ، للتأكد تمامًا من الابتسامات التي يمكن أن نظهرها وأيها لا ، سوف ننادي بهذه المهمة إلى مساعدنا.
المهمة: إذا كانت الرسالة المرسلة لا تحتوي على أي أمر محدد ، ولكن تحتوي على الرموز في النص - فقم بعرض هذه الرموز على الشاشة في شكل رسالة إلى المستخدم والإشارة إلى سماتها (العلامة والوصف).
أضف الأمر
TEXT_CONTAIN_EMOJI إلى قائمة الأوامر
سطر Command.java 8 public enum Command { ... TEXT_CONTAIN_EMOJI, ... }
في المحلل اللغوي الذي يحدد نوع الأمر المتضمن في رسالتنا ، أضف النص التالي:
Parser.java سطر 38 if (result.getCommand() == Command.NONE) { List<String> emojiContainsInText = EmojiParser.extractEmojis(result.getText()); if (emojiContainsInText.size() > 0) result.setCommand(Command.TEXT_CONTAIN_EMOJI); }
إذا قررنا أن الرسالة لا تحتوي على أي أمر محدد ، ولكن هناك رموز في هذه الرسالة ، فإننا نرجع أننا قمنا بتحليل الأمر TEXT_CONTAIN_EMOJI.
قم بإنشاء معالج منفصل يقوم بمعالجة هذا الأمر فقط:
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(); } }
يحدد هذا الرمز الرموز فقط من نص الرسالة ، ويشكل مجموعة ذات رموز فريدة ، ويختار العلامات والوصف من خصائصه ، وينشئ رسالة نصية من هذا.
تبدو نتيجة العمل كما يلي:

في الأقواس المربعة ، نحصل على علامات يمكننا استخدامها لإدراج الرموز. يمكنك أن ترى أن أكثر من علامة تشير في بعض الأحيان إلى تعبير واحد.
وأيضًا ، بمساعدة هذا المساعد ، يمكننا أن نفهم بدقة الرموز التي تتفهمها مكتبتنا وتلك التي تتجاهلها.
على سبيل المثال ، يمكنك أن ترى هنا:

ابتسم مع الكود
: face_with_monocle: لسبب ما لم يتم اكتشافه بواسطة هذه المكتبة.
لذلك ، لدينا معالج. كيف ننقل المهمة إليه؟
لأن نحن نعلم بالفعل أنه يتم اكتشاف رسالة نصية ذات رموز تعبيرية داخلية كأمر TEXT_CONTAIN_EMOJI - في MessageReciever نحتاج إلى الإشارة إلى أن معالج EmojiHandler منفصل مسؤول عن معالجة هذا الأمر.
MessageReciever.java سطر 94 case TEXT_CONTAIN_EMOJI: EmojiHandler emojiHandler = new EmojiHandler(bot); log.info("Handler for command[" + command.toString() + "] is: " + emojiHandler); return emojiHandler;
برنامج في المتعة ولا تتردد في طرح الأسئلة :)
PS
يمكنك أن تشعر بالبوت من خلال هذه الوظيفة هنا:
https://t.me/test_habr_bot .