JavaRush /Blog Java /Random-MS /Kami menambah keupayaan untuk bekerja sebagai pentadbir d...

Kami menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya - "Projek Java dari A hingga Z"

Diterbitkan dalam kumpulan
Hello semua, kawan-kawan yang dikasihi. Jadi, bot sudah berfungsi dan menghantar pemberitahuan tentang artikel baharu. Jika anda belum menggunakannya, inilah pautannya: Javarush Telegram Bot . Nah, hari ini kita akan bercakap tentang menambah arahan yang hanya berfungsi untuk pentadbir. Salah satu daripada arahan ini ialah statistik dan papan bantuan. Mengapa ini perlu? Pada masa ini, adalah lebih menarik untuk menerangkan kerja dengan anotasi dalam rangka kerja ini daripada keperluan sebenar untuknya. "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya - 1Oleh kerana kami akan pergi ke pasukan statistik, kami boleh mengembangkannya dan menjadikannya lebih bermaklumat. Selepas MVP, adalah mungkin untuk mengembalikan statistik untuk pengarang, sebagai contoh. Tetapi lebih lanjut mengenainya kemudian...)

Mari kita fahami menambahkan pentadbir dan arahan untuk mereka

Kami memulakan kerja kami dengan mengemas kini cawangan utama dan mencipta cawangan baharu berdasarkannya - STEP_9_JRTB-10. Untuk mengetahui perintah yang digunakan untuk pentadbir dan yang digunakan untuk semua orang, anda perlu melabelkan pasukan. Untuk melakukan ini, mari buat anotasi. Apakah maksudnya? Kami tidak melakukan ini sebelum ini. Ini boleh dipilih semasa membuat kelas dalam IDEA. Saya akan tunjukkan sekarang. Dalam pakej arahan, buat pakej anotasi baharu dan di dalamnya anotasi AdminCommand: "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 2Anotasi itu sendiri akan menjadi seperti ini:
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 {
}
Kami tidak memerlukan apa-apa lagi di sini. Seterusnya, kami menambahnya pada arahan StatCommand kami: "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 3Sekarang semuanya harus berfungsi... Atau tidak? Tidak, sudah tentu)) Kami perlu mengajar CommandContainer kami untuk menghasilkan hasilnya dengan betul. Untuk melakukan ini, mari kemas kini kaedah retrieveCommand , yang mengeluarkan arahan untuk dijalankan bergantung pada perkara yang dihantar kepadanya. Kami akan menggunakan nama penggunanya dalam Telegram sebagai pengecam pentadbir. Ia unik dan lebih mudah dibaca daripada chat_id. Bagaimana untuk mendapatkannya? Ia berada dalam objek Kemas kini, yang disertakan dengan mesej:
update.getMessage().getFrom().getUserName()
Merumuskan semua perkara di atas, mari kemas kini kaedah 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));
}
Seperti yang anda lihat di sini, saya menambah kaedah isAdminCommand , yang menyemak sama ada terdapat anotasi AdminCommand pada arahan yang dibekalkan. Dan jika ia adalah perintah pentadbir sahaja, kami menyemak sama ada kami mempunyai nama pengguna itu dalam koleksi pentadbir kami yang tersedia. Ngomong-ngomong, inilah, OOP, dalam semua kemuliaannya: kita hanya lulus antara muka, yang boleh menjadi apa-apa pelaksanaan. Tetapi kita hanya boleh lulus kelas yang melaksanakan antara muka Perintah . Dan semuanya nampak jelas, kecuali satu perkara: dari mana datangnya pentadbir? Saya akan tunjukkan sekarang. Buat masa ini saya mahu lulus pentadbir sebagai pembolehubah persekitaran supaya ia boleh dikonfigurasikan dengan mudah. Pembolehubah ini akan mengandungi baris di mana semua nama pengguna pengguna telegram yang akan menjadi pentadbir ditunjukkan, dipisahkan dengan koma. Untuk melakukan ini, tambahkan pada application.properties:
bot.admins: robeskman,romankh3
Dalam pembina CommandContainer kami akan lulus koleksi pentadbir dan memulakannya:
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;
Dan sudah di JavaRushTelegramBot akan ada semua keajaiban untuk mendapatkan koleksi daripada rentetan dalam sifat:
@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);
}
Seperti yang anda boleh lihat daripada pembina di atas, kami sekali lagi menggunakan anotasi Nilai , yang mana kami lulus logik untuk mencipta koleksi. Dan itu sahaja, menambah pentadbir telah berakhir. Kini, apabila bukan pentadbir ingin mendapatkan data tentang statistik bot, dia akan menerima jawapan berikut: Saya tidak faham anda 😟, tulis /bantu untuk mengetahui perkara yang saya faham. Dengan cara ini kami membezakan peranan untuk arahan bot.

Menambah arahan bantuan untuk pentadbir

Seterusnya, adalah logik untuk mencipta arahan bantuan yang berasingan untuk pentadbir. Pada masa hadapan, bahagian ini mungkin berkembang dengan ketara. Tambahkan nilai bantuan pentadbir pada CommandName:
ADMIN_HELP("/ahelp")
Buat kelas AdminHelpCommand dalam pakej arahan:
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);
   }
}
Setakat ini ia sangat mudah. Ia mungkin berkembang dengan baik pada masa hadapan. Untuk arahan ini, ujian daripada templat kami:
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);
   }
}
Sudah tentu, arahan itu perlu ditambahkan pada CommandContainer dalam peta kami:
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

Menambah perihalan arahan pada bot

Bot Telegram mempunyai satu lagi ciri menarik: anda boleh menambah nilai dan perihalan arahan yang diterimanya untuk memudahkan pengguna menggunakan arahan tersebut. Bagaimana rupanya? Sebagai contoh, mari pergi ke BotFather - bot Telegram yang paling penting. Jika anda mula menulis mesej dengan garis miring /, bot akan menawarkan pilihan: "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 4Dan jika anda terus menulis, ia akan menapis dan menunjukkan pilihan yang berkaitan: "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 5Fungsi yang hebat, bukan? Jadi saya mahu melakukan perkara yang sama di sini. Saya akan melakukannya dengan cara yang terbaik - melalui aplikasi Telegram. Saya tahu ini boleh dilakukan secara pemrograman. Tetapi saya tidak boleh. Ini tidak perlu untuk tujuan siri artikel ini. Jika sesiapa tahu bagaimana untuk melakukan ini, tulis kepada saya, kami akan menambahnya. Saya dengan senang hati akan menerima sebarang bantuan dengan ini. Saya pernah membaca bahawa ini boleh dilakukan melalui corak arahan yang berfungsi untuk kita. Sekarang saya akan menunjukkan kepada anda bagaimana saya boleh melakukan ini: kita perlu mencari BotFather dalam Telegram, pilih bot yang ingin kita konfigurasikan. Seterusnya, pilih mengedit bot dan bahagian tentang arahan. Sekarang saya akan menunjukkan segala-galanya menggunakan contoh bot ujian saya untuk Javarush. Di BotFather kami menulis arahan: /mybots"Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 6 Seterusnya, pilih bot yang kami perlukan, dalam kes saya ia akan menjadi test_javarush_community_bot: "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 7Seperti yang anda boleh lihat daripada senarai butang, di sini anda boleh melihat token, memadam bot, dan memindahkannya ke orang lain. Kami berminat untuk mengedit bot, jadi kami memilih Edit Bot : "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 8Dan di sini kami memilih Edit Perintah : "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 9Kami hanya perlu menyediakan mesej dalam format tertentu, dan ia akan direkodkan sebagai arahan. Atau jika kita ingin mengalih keluar semuanya, tulis /kosong. Untuk tujuan ini, saya akan mencipta fail dalam akar projek SET_UP_COMMANDS_BOT_FATHER , di mana saya akan menulis semua arahan kami supaya mudah untuk memulihkan atau mengemas kini jika sesuatu berlaku. SET_UP_COMMANDS_BOT_FATHER:
mulakan - mulakan/pulihkan kerja dengan bot stop - jeda kerja dengan bot addGroupSub - langgan sekumpulan artikel deleteGroupSub - nyahlanggan kumpulan artikel listGroupSub - senarai kumpulan yang anda langgan bantuan - dapatkan bantuan bekerja dengan saya
Adalah jelas bahawa kami tidak membawa arahan pentadbir di sini. Hanya pentadbir yang perlu tahu tentang mereka. Mari kita ambil mesej ini dan sampaikan kepada BotFather: "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 10Seperti biasa, ia tidak berjaya pada kali pertama. Selepas beberapa minit berfikir, saya lulus semua arahan dalam huruf kecil, dan bukan dalam CamelCase seperti sebelum ini, dan semuanya berjalan lancar. Kami mengemas kini dalam fail kami: SET_UP_COMMANDS_BOT_FATHER:
mulakan - mulakan/pulihkan kerja dengan bot stop - jeda kerja dengan bot addgroupsub - langgan kumpulan artikel deletegroupsub - nyahlanggan kumpulan artikel listgroupsub - senarai kumpulan yang anda langgan bantuan - dapatkan bantuan bekerja dengan saya
Sekarang anda boleh pergi ke bot kami dan lihat sama ada arahan telah dimuatkan secara automatik: "Projek Java dari A hingga Z": Menambah keupayaan untuk bekerja sebagai pentadbir dan statistik untuknya.  Bahagian 1 - 11Lihatlah betapa cantiknya sekarang! Saya juga ingin mengembangkan kefungsian statistik dalam rangka artikel ini, tetapi bahan itu sudah banyak dari segi makna dan kandungan. Oleh itu, kami akan menangguhkan ini untuk kali seterusnya. Iaitu, tugas JRTB-10 tidak selesai sepenuhnya: kami akan menyelesaikannya dalam artikel seterusnya. Pada masa yang sama, saya akan menambah semua perubahan yang telah wujud pada bot utama. Ingin menyokong penulis, tetapi tidak tahu bagaimana? Ia sangat mudah - langgan saluran tg saya , akaun GitHub saya dan tulis pendapat anda tentangnya dalam artikel di sini. Maklum balas ini penting bagi saya, jadi saya faham bahawa mereka membaca dan berminat dengannya.

kesimpulan

Mari kita ringkaskan apa yang kita lalui hari ini:
  1. Kami membincangkan cara menambah anotasi anda sendiri dan cara ia boleh digunakan sebagai penanda untuk menggambarkan peranan dalam pasukan. Dengan cara ini, ini boleh dilakukan menggunakan antara muka. Dengan cara yang sama, kami akan mencipta antara muka penanda dan kemudian menyemak sama ada objek yang tiba melaksanakan antara muka ini atau tidak.
  2. Menambahkan arahan Bantuan untuk pentadbir. Bagi saya, ini juga merupakan bahagian penting dalam pembangunan bot ini.
  3. Kami membincangkan cara menambah penerangan dan pop timbul arahan semasa menulisnya dalam bot. Ciri yang menarik, pasti bernilai ditambah.
Berdasarkan artikel ini, saya mencipta permintaan tarik , anda boleh melihat butirannya. Terima kasih semua atas perhatian anda, seperti biasa: suka - langgan - loceng , bintang untuk projek kami, komen dan nilai artikel! Jumpa anda dalam artikel seterusnya!

Senarai semua bahan dalam siri ini adalah pada permulaan artikel ini.

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