JavaRush /مدونة جافا /Random-AR /نضيف له القدرة على العمل كمسؤول وإحصائيات له - "مشروع جاف...
Roman Beekeeper
مستوى

نضيف له القدرة على العمل كمسؤول وإحصائيات له - "مشروع جافا من الألف إلى الياء"

نشرت في المجموعة
مرحبا بالجميع، أصدقائي الأعزاء. لذا، فإن الروبوت يعمل بالفعل ويرسل إشعارات حول المقالات الجديدة. إذا لم تكن تستخدمه بعد، فإليك الرابط: Javarush Telegram Bot . حسنًا، سنتحدث اليوم عن إضافة أوامر تعمل فقط للمسؤولين. أحد هذه الأوامر هو الإحصائيات ولوحة المساعدة. لماذا هذا ضروري؟ في الوقت الحالي، يعد وصف العمل مع التعليقات التوضيحية في إطار هذه المهمة أكثر إثارة للاهتمام من الحاجة الفعلية إليه. "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له - 1حسنًا، بما أننا سنذهب إلى فريق الإحصائيات، فيمكننا توسيعه وجعله أكثر إفادة. بعد MVP، سيكون من الممكن إرجاع إحصائيات للمؤلفين، على سبيل المثال. ولكن أكثر عن ذلك لاحقا...)

دعونا نفهم إضافة المسؤولين والأوامر لهم

نبدأ عملنا بتحديث الفرع الرئيسي وإنشاء فرع جديد بناءً عليه - STEP_9_JRTB-10. لمعرفة الأمر الذي ينطبق على المسؤولين والذي ينطبق على الجميع، تحتاج إلى تصنيف الفريق. للقيام بذلك، دعونا إنشاء تعليق توضيحي. ماذا يعني ذلك؟ لم نفعل هذا من قبل. يمكن تحديد هذا عند إنشاء فصل دراسي في IDEA. سأظهر لك الآن. في حزمة الأوامر، قم بإنشاء حزمة تعليقات توضيحية جديدة وفيها تعليق AdminCommand: "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 2سيكون التعليق التوضيحي نفسه كما يلي:
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 {
}
لا نحتاج إلى أي شيء آخر هنا. بعد ذلك، نضيفه إلى أمر StatCommand الخاص بنا: "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 3الآن يجب أن يعمل كل شيء... أم لا؟ لا، بالطبع)) نحتاج إلى تعليم CommandContainer الخاص بنا كيفية إنتاج النتيجة بشكل صحيح. للقيام بذلك، دعونا نقوم بتحديث طريقة RetrieveCommand ، التي تصدر أمرًا ليتم تشغيله اعتمادًا على ما يتم تمريره إليه. سنستخدم اسم المستخدم الخاص به في Telegram كمعرف المسؤول. إنه فريد وأسهل في القراءة من chat_id. كيف يمكن الحصول عليها؟ إنه موجود في كائن التحديث، والذي يأتي مع الرسالة:
update.getMessage().getFrom().getUserName()
تلخيصًا لكل ما سبق، فلنقم بتحديث طريقة 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));
}
كما ترون هنا، قمت بإضافة طريقة isAdminCommand ، والتي تتحقق مما إذا كان هناك تعليق توضيحي لـ AdminCommand على الأمر المقدم. وإذا كان أمرًا للمسؤول فقط، فإننا نتحقق لمعرفة ما إذا كان لدينا اسم المستخدم هذا في مجموعتنا من المسؤولين المتاحين. بالمناسبة، ها هو OOP، بكل مجده: نحن ببساطة نمرر واجهة، والتي يمكن أن تكون أي تطبيق. لكن لا يمكننا تجاوز سوى الفئة التي تنفذ واجهة الأوامر . ويبدو أن كل شيء واضح، باستثناء شيء واحد: من أين جاء المشرفون؟ سأظهر لك الآن. في الوقت الحالي، أريد تمرير المسؤولين كمتغير بيئة بحيث يمكن تهيئته بسهولة. سيحتوي هذا المتغير على سطر يُشار فيه إلى جميع أسماء مستخدمي Telegram الذين سيكونون مسؤولين، مفصولة بفواصل. للقيام بذلك، أضف إلى application.properties:
bot.admins: robeskman,romankh3
في مُنشئ CommandContainer، سنقوم بتمرير مجموعة المسؤولين وتهيئتها:
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;
وبالفعل في JavaRushTelegramBot سيكون هناك كل سحر الحصول على مجموعة من سلسلة في الخصائص:
@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);
}
كما ترون من المنشئ أعلاه، نستخدم مرة أخرى التعليق التوضيحي للقيمة ، الذي نمرر إليه منطق إنشاء المجموعة. وهذا كل شيء، وبذلك تكون عملية إضافة المشرف قد انتهت. الآن، عندما يريد شخص غير مسؤول الحصول على بيانات حول إحصائيات البوت، سيتلقى الإجابة التالية: أنا لا أفهمك 😟، اكتب/ساعد لتعرف ما أفهمه. بهذه الطريقة قمنا بتمييز أدوار أوامر الروبوت.

إضافة أمر مساعدة للمسؤولين

بعد ذلك، سيكون من المنطقي إنشاء أمر تعليمات منفصل للمسؤولين. وفي المستقبل قد ينمو هذا الجزء بشكل ملحوظ. أضف قيمة مساعدة المسؤول إلى CommandName:
ADMIN_HELP("/ahelp")
قم بإنشاء فئة AdminHelpCommand في حزمة الأوامر:
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);
   }
}
حتى الآن الأمر بسيط للغاية. قد تنمو بشكل جيد في المستقبل. بالنسبة لهذا الأمر، اختبار من القالب الخاص بنا:
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);
   }
}
بالطبع، يجب إضافة الأمر إلى CommandContainer في خريطتنا:
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

إضافة وصف للأوامر إلى البوت

تتمتع روبوتات Telegram بميزة أخرى مثيرة للاهتمام: يمكنك إضافة قيم وأوصاف للأوامر التي تقبلها لتسهيل استخدام الأوامر على المستخدم. كيف تبدو؟ على سبيل المثال، دعنا نذهب إلى BotFather - أهم روبوت Telegram. إذا بدأت في كتابة رسالة بشرطة مائلة /، فسيقدم "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 4لك الروبوت خيارات: وإذا واصلت الكتابة، فسوف يقوم بتصفية الخيارات ذات الصلة وإظهارها: "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 5وظيفة رائعة، أليس كذلك؟ لذلك أريد أن أفعل الشيء نفسه هنا. سأفعل ذلك بأفضل طريقة ممكنة، من خلال تطبيق Telegram. أعلم أنه يمكن القيام بذلك برمجياً. لكن انا لا استطيع. وهذا ليس ضروريا لأغراض هذه السلسلة من المقالات. إذا كان أي شخص يعرف كيفية القيام بذلك، يكتب لي، وسوف نقوم بإضافته. وسأقبل بكل سرور أي مساعدة في هذا الشأن. قرأت ذات مرة أنه يمكن القيام بذلك من خلال نمط الأوامر الذي يناسبنا. سأوضح لك الآن كيف يمكنني القيام بذلك: نحتاج إلى العثور على BotFather في Telegram، وتحديد الروبوت الذي نريد تهيئته. بعد ذلك، حدد تحرير الروبوت والقسم الخاص بالأوامر. الآن سأعرض كل شيء باستخدام مثال برنامج الاختبار الخاص بي لـ Javarush. في BotFather نكتب الأمر: /mybots"مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 6 بعد ذلك، حدد الروبوت الذي نحتاجه، في حالتي سيكون test_javarush_community_bot: "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 7كما ترون من قائمة الأزرار، هنا يمكنك عرض الرمز المميز، وحذف الروبوت، ونقله إلى شخص اخر. نحن مهتمون بتحرير الروبوت، لذلك نختار تحرير الروبوت : "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 8وهنا نختار أوامر التحرير : "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 9نحتاج فقط إلى تقديم رسالة بتنسيق معين، وسيتم تسجيلها كأوامر. أو إذا أردنا حذفها كلها، اكتب /فارغة. لهذا الغرض، سأقوم بإنشاء ملف في جذر المشروع SET_UP_COMMANDS_BOT_FATHER ، حيث سأكتب جميع أوامرنا بحيث يكون من السهل استعادتها أو تحديثها في حالة حدوث شيء ما. SET_UP_COMMANDS_BOT_FATHER:
بدء - بدء/استعادة العمل باستخدام توقف الروبوت - إيقاف العمل مؤقتًا باستخدام الروبوت addGroupSub - الاشتراك في مجموعة مقالات حذفGroupSub - إلغاء الاشتراك من مجموعة مقالات listGroupSub - قائمة المجموعات التي اشتركت فيها مساعدة - الحصول على مساعدة في العمل معي
من الواضح أننا لا نحمل أوامر المشرف هنا. يجب أن يعرف المشرفون فقط عنهم. لنأخذ هذه الرسالة ونمررها إلى BotFather: "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 10كما هو الحال عادةً، لم ينجح الأمر في المرة الأولى. بعد بضع دقائق من التفكير، مررت جميع الأوامر بالأحرف الصغيرة، وليس في CamelCase كما كان من قبل، وسارت الأمور على ما يرام. نقوم بالتحديث في ملفنا: SET_UP_COMMANDS_BOT_FATHER:
بدء - بدء/استعادة العمل مع توقف الروبوت - إيقاف العمل مؤقتًا مع الروبوت addgroupsub - الاشتراك في مجموعة من المقالاتdeletegroupsub - إلغاء الاشتراك من مجموعة مقالات listgroupsub - قائمة المجموعات التي اشتركت فيها مساعدة - احصل على مساعدة في العمل معي
يمكنك الآن الانتقال إلى الروبوت الخاص بنا ومعرفة ما إذا كان قد تم تحميل الأوامر تلقائيًا: "مشروع جافا من الألف إلى الياء": إضافة إمكانية العمل كمسؤول وإحصائيات له.  الجزء 1 - 11انظر كم هو جميل الآن! أردت أيضًا توسيع وظائف الإحصاء في إطار هذه المقالة، لكن المادة كانت ضخمة بالفعل من حيث المعنى والمحتوى. ولذلك سنؤجل ذلك للمرة القادمة. أي أن مهمة JRTB-10 لم تكتمل بعد: سنكملها في المقالة التالية. وفي الوقت نفسه، سأضيف جميع التغييرات الموجودة بالفعل إلى الروبوت الرئيسي. هل تريد دعم المؤلف، لكن لا تعرف كيف؟ الأمر بسيط للغاية - اشترك في قناتي tg وحسابي على GitHub واكتب رأيك عنهما في المقالات هنا. هذه التعليقات مهمة بالنسبة لي، لذلك أفهم أنهم يقرؤونها ويهتمون بها.

الاستنتاجات

دعونا نلخص ما مررنا به اليوم:
  1. ناقشنا كيفية إضافة التعليق التوضيحي الخاص بك وكيف يمكن استخدامه كعلامة لتحديد الأدوار في الفرق. بالمناسبة، كان من الممكن أن يتم ذلك باستخدام الواجهة. بنفس الطريقة، سنقوم بإنشاء واجهة علامة ثم نتحقق مما إذا كان الكائن الذي يصل ينفذ هذه الواجهة أم لا.
  2. تمت إضافة أمر تعليمات للمسؤولين. بالنسبة لي، يعد هذا أيضًا جزءًا مهمًا في تطوير هذا الروبوت.
  3. ناقشنا كيفية إضافة وصف ونافذة منبثقة للأوامر عند كتابتها في الروبوت. ميزة مثيرة للاهتمام، بالتأكيد تستحق الإضافة.
بناءً على هذه المقالة، قمت بإنشاء طلب سحب ، يمكنك الاطلاع على تفاصيله. شكرًا لكم جميعًا على اهتمامكم كالعادة: إعجاب - اشتراك - جرس ، نجمة لمشروعنا، تعليق وتقييم المقال! نراكم في المقال التالي!

توجد قائمة بجميع المواد الموجودة في السلسلة في بداية هذه المقالة.

تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION