JavaRush /Java Blog /Random-ID /Kami menambahkan kemampuan untuk bekerja sebagai administ...

Kami menambahkan kemampuan untuk bekerja sebagai administrator dan statistik untuknya - “Proyek Java dari A hingga Z”

Dipublikasikan di grup Random-ID
Halo semuanya, teman-teman terkasih. Jadi, bot tersebut sudah berfungsi dan mengirimkan notifikasi tentang artikel baru. Kalau belum pakai, ini linknya: Javarush Telegram Bot . Nah, hari ini kita akan membahas tentang menambahkan perintah yang hanya berfungsi untuk admin. Salah satu perintah ini adalah statistik dan papan bantuan. Mengapa hal ini perlu? Saat ini, lebih menarik untuk mendeskripsikan pekerjaan dengan anotasi dalam kerangka tugas ini daripada kebutuhan sebenarnya. "Proyek Java dari A hingga Z": Menambahkan kemampuan untuk bekerja sebagai administrator dan statistik untuknya - 1Nah, karena kita masuk ke tim statistik, kita bisa memperluasnya dan membuatnya lebih informatif. Setelah MVP, statistik penulis dapat dikembalikan, misalnya. Tapi lebih lanjut tentang itu nanti...)

Mari kita pahami menambahkan admin dan perintah untuk mereka

Kami memulai pekerjaan kami dengan memperbarui cabang utama dan membuat yang baru berdasarkan itu - STEP_9_JRTB-10. Untuk mengetahui perintah mana yang berlaku untuk admin dan mana yang berlaku untuk semua orang, Anda perlu memberi label pada tim. Untuk melakukan ini, mari buat anotasi. Apa artinya? Kami belum pernah melakukan ini sebelumnya. Ini dapat dipilih saat membuat kelas di IDEA. Saya akan menunjukkannya kepada Anda sekarang. Di paket perintah, buat paket anotasi baru dan di dalamnya ada anotasi AdminCommand: "Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 2Anotasinya sendiri akan 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 membutuhkan apa pun di sini. Selanjutnya, kita menambahkannya ke perintah StatCommand kita: "Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 3Sekarang semuanya akan berfungsi... Atau tidak? Tidak, tentu saja)) Kita perlu mengajarkan CommandContainer kita untuk menghasilkan hasil dengan benar. Untuk melakukan ini, mari perbarui metode retrieveCommand , yang mengeluarkan perintah untuk dijalankan tergantung pada apa yang diteruskan ke sana. Kami akan menggunakan nama penggunanya di Telegram sebagai pengenal admin. Unik dan lebih mudah dibaca dibandingkan chat_id. Bagaimana cara mendapatkannya? Itu ada di objek Update, yang disertai dengan pesan:
update.getMessage().getFrom().getUserName()
Meringkas semua hal di atas, mari perbarui metode 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 menambahkan metode isAdminCommand , yang memeriksa apakah ada anotasi AdminCommand pada perintah yang diberikan. Dan jika itu hanya perintah admin, kami memeriksa apakah kami memiliki nama pengguna tersebut di koleksi admin yang tersedia. Omong-omong, ini dia, OOP, dengan segala kemegahannya: kita cukup meneruskan sebuah antarmuka, yang dapat berupa implementasi apa pun. Tapi kita hanya bisa melewatkan kelas yang mengimplementasikan antarmuka Command . Dan semuanya tampak jelas, kecuali satu hal: dari mana adminnya berasal? Saya akan menunjukkannya kepada Anda sekarang. Untuk saat ini saya ingin meneruskan admin sebagai variabel lingkungan sehingga dapat dikonfigurasi dengan mudah. Variabel ini akan berisi baris yang mencantumkan semua nama pengguna pengguna telegram yang akan menjadi administrator, dipisahkan dengan koma. Untuk melakukan ini, tambahkan ke application.properties:
bot.admins: robeskman,romankh3
Di konstruktor CommandContainer kita akan meneruskan kumpulan admin dan menginisialisasinya:
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 keajaiban mendapatkan koleksi dari string di properti:
@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 dapat Anda lihat dari konstruktor di atas, kami kembali menggunakan anotasi Nilai , yang menjadi tempat kami meneruskan logika untuk membuat koleksi. Dan itu saja, penambahan admin sudah selesai. Nah, ketika seorang non-admin ingin mendapatkan data statistik bot, dia akan menerima jawaban berikut: Saya tidak mengerti kamu 😟, tulis /bantu untuk mengetahui apa yang saya mengerti. Dengan cara ini kami membedakan peran perintah bot.

Menambahkan perintah bantuan untuk admin

Selanjutnya, logis untuk membuat perintah bantuan terpisah untuk administrator. Di masa depan, bagian ini mungkin akan tumbuh secara signifikan. Tambahkan nilai bantuan admin ke CommandName:
ADMIN_HELP("/ahelp")
Buat kelas AdminHelpCommand dalam paket perintah:
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);
   }
}
Sejauh ini sangat sederhana. Ini mungkin akan tumbuh cukup baik di masa depan. Untuk perintah ini, tes dari 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);
   }
}
Tentu saja, perintah tersebut perlu ditambahkan ke CommandContainer di peta kita:
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

Menambahkan deskripsi perintah ke bot

Bot Telegram memiliki fitur menarik lainnya: Anda dapat menambahkan nilai dan deskripsi perintah yang diterimanya untuk memudahkan pengguna menggunakan perintah tersebut. Seperti apa bentuknya? Sebagai contoh, mari kita buka Botfather - bot Telegram yang paling penting. Jika Anda mulai menulis pesan dengan garis miring /, bot akan menawarkan opsi: "Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 4Dan jika Anda terus menulis, ia akan memfilter dan menampilkan opsi yang relevan: "Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 5Fungsionalitas keren, bukan? Jadi saya ingin melakukan hal yang sama di sini. Saya akan melakukannya semampu saya - melalui aplikasi Telegram. Saya tahu ini bisa dilakukan secara terprogram. Tetapi saya tidak bisa. Hal ini tidak diperlukan untuk tujuan rangkaian artikel ini. Jika ada yang tahu cara melakukan ini, tulislah kepada saya, kami akan menambahkannya. Saya dengan senang hati akan menerima bantuan apa pun dalam hal ini. Saya pernah membaca bahwa ini dapat dilakukan melalui pola perintah yang cocok untuk kita. Sekarang saya akan menunjukkan kepada Anda bagaimana saya bisa melakukan ini: kita perlu menemukan Botfather di Telegram, pilih bot yang ingin kita konfigurasi. Selanjutnya, pilih edit bot dan bagian tentang perintah. Sekarang saya akan menunjukkan semuanya menggunakan contoh bot pengujian saya untuk Javarush. Di BotAyah kami menulis perintah: /mybots"Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 6 Selanjutnya, pilih bot yang kami perlukan, dalam kasus saya ini adalah test_javarush_community_bot: "Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 7Seperti yang Anda lihat dari daftar tombol, di sini Anda dapat melihat token, menghapus bot, dan mentransfernya ke orang lain. Kami tertarik untuk mengedit bot, jadi kami pilih Edit Bot : "Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 8Dan di sini kami pilih Edit Perintah : "Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 9Kami hanya perlu memberikan pesan dalam format tertentu, dan itu akan dicatat sebagai perintah. Atau jika kita ingin menghapus semuanya, tulis /kosongkan. Untuk tujuan ini, saya akan membuat file di root proyek SET_UP_COMMANDS_BOT_FATHER , di mana saya akan menulis semua perintah kami sehingga mudah untuk memulihkan atau memperbarui jika terjadi sesuatu. SET_UP_COMMANDS_BOT_FATHER:
mulai - mulai/pulihkan pekerjaan dengan bot berhenti - jeda pekerjaan dengan bot addGroupSub - berlangganan grup artikel deleteGroupSub - berhenti berlangganan dari grup artikel listGroupSub - daftar grup tempat Anda berlangganan bantuan - dapatkan bantuan untuk bekerja dengan saya
Jelas bahwa kami tidak membawa perintah admin di sini. Hanya admin yang boleh mengetahuinya. Mari kita ambil pesan ini dan sampaikan ke Botfather: "Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 10Seperti yang biasanya terjadi, ini tidak berhasil pada kali pertama. Setelah beberapa menit berpikir, saya meneruskan semua perintah dalam huruf kecil, dan bukan dalam CamelCase seperti sebelumnya, dan semuanya berjalan dengan baik. Kami memperbarui di file kami: SET_UP_COMMANDS_BOT_FATHER:
mulai - mulai/pulihkan pekerjaan dengan bot berhenti - jeda pekerjaan dengan bot addgroupsub - berlangganan grup artikel deletegroupsub - berhenti berlangganan grup artikel listgroupsub - daftar grup tempat Anda berlangganan bantuan - dapatkan bantuan untuk bekerja dengan saya
Sekarang Anda dapat masuk ke bot kami dan melihat apakah perintah telah dimuat secara otomatis: "Proyek Java dari A sampai Z": Menambahkan kemampuan untuk bekerja sebagai admin dan statistik untuknya.  Bagian 1 - 11Lihat betapa indahnya sekarang! Saya juga ingin memperluas fungsi statistik dalam kerangka artikel ini, tetapi materinya sudah sangat banyak baik makna maupun isinya. Oleh karena itu, kami akan menundanya untuk waktu berikutnya. Artinya, tugas JRTB-10 belum sepenuhnya selesai: akan kami selesaikan di artikel selanjutnya. Sekaligus saya akan menambahkan semua perubahan yang sudah ada pada bot utama. Ingin mendukung penulis, tetapi tidak tahu caranya? Ini sangat sederhana - berlangganan saluran tg saya , akun GitHub saya dan tulis pendapat Anda tentang mereka di artikel di sini. Umpan balik ini penting bagi saya, jadi saya memahami bahwa mereka dibaca dan tertarik.

kesimpulan

Mari kita rangkum apa yang kita lalui hari ini:
  1. Kami membahas cara menambahkan anotasi Anda sendiri dan bagaimana anotasi tersebut dapat digunakan sebagai penanda untuk menggambarkan peran dalam tim. Omong-omong, ini bisa dilakukan dengan menggunakan antarmuka. Dengan cara yang sama, kita akan membuat antarmuka penanda dan kemudian memeriksa apakah objek yang datang mengimplementasikan antarmuka ini atau tidak.
  2. Menambahkan perintah Bantuan untuk admin. Bagi saya, ini juga merupakan bagian penting dalam pengembangan bot ini.
  3. Kami membahas cara menambahkan deskripsi dan popup perintah saat menulisnya di bot. Fitur menarik, pasti layak untuk ditambahkan.
Berdasarkan artikel ini, saya membuat pull request , Anda dapat melihat detailnya. Terima kasih atas perhatian Anda, seperti biasa: suka - berlangganan - bel , bintangi proyek kami, komentari, dan beri peringkat artikel! Sampai jumpa di artikel berikutnya!

Daftar semua materi dalam seri ini ada di awal artikel ini.

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