Anda dapat menginstal versi PYPI terbaru dari perpustakaan dengan melakukan:
$ pip install reactionmenu
Atau versi pengembangan:
$ pip install git+https://github.com/Defxult/reactionmenu
Maksud minimum yang dibutuhkan
bot = commands . Bot (..., intents = discord . Intents ( messages = True , guilds = True , reactions = True , members = True )) class reactionmenu.ReactionMenu(method: Union[Context, discord.Interaction], /, *, menu_type: MenuType, **kwargs)
ReactionMenu adalah menu yang menggunakan emoji yang merupakan emoji guild khusus atau emoji normal untuk mengontrol proses pagination. Jika Anda tidak mencari fitur mewah apa pun dan hanya menginginkan sesuatu yang sederhana, ini yang digunakan.
from reactionmenu import ReactionMenu , ReactionButtonPerpustakaan ini dilengkapi dengan beberapa metode dan opsi untuk membuat menu reaksi perselisihan sederhana. Setelah mengimpor kelas yang tepat, Anda akan menginisialisasi konstruktor seperti itu:
menu = ReactionMenu ( method , menu_type = ReactionMenu . TypeEmbed )method ( Union[discord.ext.commands.Context, discord.Interaction] ) Objek konteks atau interaksimenu_type ( MenuType ) Konfigurasi menuReactionMenu.TypeEmbed , menu pagination sematan normalReactionMenu.TypeEmbedDynamic , menu pagination embed dengan data dinamisReactionMenu.TypeText , menu pagination hanya teks| Nama | Jenis | Nilai default | Digunakan untuk | Info |
|---|---|---|---|---|
wrap_in_codeblock | str | None | ReactionMenu.TypeEmbedDynamic | Pengidentifikasi bahasa CodeBlock Discord untuk membungkus data Anda. Contoh: ReactionMenu(ctx, ..., wrap_in_codeblock='py') |
custom_embed | discord.Embed | None | ReactionMenu.TypeEmbedDynamic | Embed objek untuk digunakan saat menambahkan data dengan ReactionMenu.add_row() . Digunakan untuk tujuan gaya |
delete_on_timeout | bool | False | All menu types | Hapus menu saat keluar |
clear_reactions_after | bool | True | All menu types | hapus semua reaksi setelah waktu menu keluar |
navigation_speed | str | ReactionMenu.NORMAL | All menu types | Set jika pengguna perlu menunggu reaksi dihapus oleh bot sebelum "memutar" halaman. Mengatur kecepatan ke ReactionMenu.FAST membuatnya sehingga tidak perlu menunggu (reaksi tidak dihapus pada setiap pers) dan dapat menavigasi menu yang panjang lebih cepat |
only_roles | List[discord.Role] | None | All menu types | Jika diatur, hanya anggota dengan peran yang diberikan yang diizinkan untuk mengontrol menu. Pemilik menu selalu dapat mengontrol menu |
timeout | Union[int, float, None] | 60.0 | All menu types | Pengatur waktu saat menu habis. None bisa tanpa batas waktu |
show_page_director | bool | True | All menu types | Ditampilkan di bagian bawah setiap halaman sematan. "Halaman 1/20" |
name | str | None | All menu types | Nama yang dapat Anda atur untuk menu |
style | str | "Page $/&" | All menu types | Gaya sutradara halaman khusus yang dapat Anda pilih. "$" mewakili halaman saat ini, "&" mewakili jumlah total halaman. Contoh: ReactionMenu(ctx, ..., style='On $ out of &') |
all_can_click | bool | False | All menu types | Set jika semua orang diizinkan untuk mengontrol ketika halaman 'diputar' saat tombol diklik |
delete_interactions | bool | True | All menu types | Hapus Pesan Prompt oleh Bot dan Pesan Respons oleh Pengguna Saat Ditanya Halaman Apa yang Ingin Mereka Kunjungi Saat Menggunakan ReactionButton.Type.GO_TO_PAGE |
rows_requested | int | None | ReactionMenu.TypeEmbedDynamic | Jumlah informasi per ReactionMenu.add_row() Anda ingin diterapkan pada setiap halaman embed |
remove_extra_emojis | bool | False | All menu types | Jika True , semua emoji (reaksi) ditambahkan ke pesan menu yang awalnya tidak ditambahkan ke menu akan dihapus |
Bergantung pada menu_type , halaman dapat berupa str , discord.Embed , atau kombinasi content dan files (contoh di bawah)
menu_type adalah ReactionMenu.TypeEmbed , gunakan embedsmenu_type adalah ReactionMenu.TypeText (hanya menu teks) atau ReactionMenu.TypeEmbedDynamic (hanya menu embed), gunakan string.ReactionMenu.add_page(embed: discord.Embed=MISSING, content: Optional[str]=None, files: Optional[Sequence[discord.File]]=None)ReactionMenu.add_pages(pages: Sequence[Union[discord.Embed, str]])ReactionMenu.add_row(data: str)ReactionMenu.remove_all_pages()ReactionMenu.clear_all_row_data()ReactionMenu.remove_page(page_number: int)ReactionMenu.set_main_pages(*embeds: Embed)ReactionMenu.set_last_pages(*embeds: Embed) # ReactionMenu.TypeEmbed
menu = ReactionMenu ( method , menu_type = ReactionMenu . TypeEmbed )
menu . add_page ( summer_embed )
menu . add_page ( winter_embed )
# ReactionMenu.TypeText
menu = ReactionMenu ( method , menu_type = ReactionMenu . TypeText )
menu . add_page ( content = 'Its so hot!' )
menu . add_page ( content = 'Its so cold!' ) Menu TypeText adalah menu pagination berbasis teks. Tidak ada embed yang terlibat dalam proses pagination, hanya teks biasa yang digunakan.
Dengan v3.1.0+ , Anda dapat memberi paginasi dengan lebih dari sekedar embed atau teks. Anda dapat menggabungkan teks, embed, serta file. Tetapi tergantung pada menu_type kombinasi dapat dibatasi. Berikut adalah contoh menu dengan menu_type TypeEmbed yang ditumpuk.
# You can use regular commands as well
@ bot . tree . command ( description = "These are stacked pages" , guild = discord . Object ( id = ...))
async def stacked ( interaction : discord . Interaction ):
menu = ReactionMenu ( interaction , menu_type = ReactionMenu . TypeEmbed )
menu . add_page ( discord . Embed ( title = "My Embed" ), content = "This content is stacked on top of a file" , files = [ discord . File ( "stacked.py" )])
menu . add_page ( discord . Embed ( title = "Hey Wumpos, can you say hi to the person reading this? ?" ))
menu . add_page ( discord . Embed ( title = "Hi, I'm Wumpos!" ), files = [ discord . File ( "wumpos.gif" )])
menu . add_button ( ReactionButton . back ())
menu . add_button ( ReactionButton . next ())
await menu . start () Karena menu_type TypeEmbed , harus selalu ada sematan pada setiap halaman. Jika menu_type adalah TypeText , embed tidak diizinkan dan Anda akan dibatasi hanya menggunakan parameter files .
Menu dinamis digunakan ketika Anda tidak tahu berapa banyak informasi yang akan diterapkan pada menu. Misalnya, jika Anda meminta informasi dari database, informasi itu selalu dapat berubah. Anda menanyakan sesuatu dan Anda mungkin mendapatkan 1.500 hasil kembali, dan berikutnya mungkin hanya 800. Menu dinamis menyatukan semua informasi ini untuk Anda dan menambahkannya ke halaman embed dengan baris data. ReactionMenu.add_row() paling baik digunakan dalam semacam Iterable di mana semuanya dapat diatasi, tetapi hanya menambahkan jumlah data yang Anda inginkan ke halaman menu.
CATATAN: Dalam menu dinamis, semua data yang ditambahkan ditempatkan di bagian deskripsi dari embed. Jika Anda memilih untuk menggunakan
custom_embed, semua teks dalam deskripsi akan ditimpa dengan data yang Anda tambahkan
ReactionMenu.add_row(data: str)ReactionMenu.clear_all_row_data()ReactionMenu.set_main_pages(*embeds: Embed)ReactionMenu.set_last_pages(*embeds: Embed)rows_requested - Jumlah baris yang Anda inginkan di setiap halaman embed sebelum membuat halaman baruReactionMenu(..., rows_requested=5)custom_embed - Embed yang telah Anda buat untuk digunakan sebagai halaman sematan. Digunakan untuk estetika menu AndaReactionMenu(..., custom_embed=red_embed)wrap_in_codeblock - pengidentifikasi bahasa saat membungkus data Anda di CodeBlock Perselisihan.ReactionMenu(..., wrap_in_codeblock='py') menu = ReactionMenu ( ctx , menu_type = ReactionMenu . TypeEmbedDynamic , rows_requested = 5 )
for data in database . request ( 'SELECT * FROM customers' ):
menu . add_row ( data ) Anda dapat menghapus semua data yang telah Anda tambahkan ke menu dengan menggunakan menu.clear_all_row_data()
Saat menggunakan menu dinamis, satu -satunya halaman sematan yang Anda lihat adalah dari data yang telah Anda tambahkan. Tetapi jika Anda ingin menampilkan lebih banyak halaman selain data, Anda dapat menggunakan metode ReactionMenu.set_main_pages() dan ReactionMenu.set_last_pages() . Mengatur halaman utama, embed yang Anda setel akan menjadi embed pertama yang ditampilkan saat menu dimulai. Mengatur halaman terakhir adalah embed terakhir yang ditampilkan
menu . set_main_pages ( welcome_embed , announcement_embed )
for data in get_information ():
menu . add_row ( data )
menu . set_last_pages ( additional_info_embed )
# NOTE: setting main/last pages can be set in any orderTipe Tombol/Tombol digunakan saat Anda ingin menambahkan reaksi ke menu yang melakukan fungsi tertentu. Tombol dan tipe tombol bekerja bersama untuk mencapai tindakan yang diinginkan.
class reactionmenu.ReactionButton(*, emoji: str, linked_to: ButtonType, **kwargs)
emoji ( str ) emoji yang ingin Anda gunakan sebagai reaksinyalinked_to ( ReactionButton.Type ) Saat reaksi ditekan, inilah yang menentukan apa yang akan dilakukannya| Nama | Jenis | Nilai default | Digunakan untuk |
|---|---|---|---|
embed | discord.Embed | None | Saat reaksi ditekan, pergilah ke embed yang ditentukan |
name | str | None | Nama tombolnya |
details | info di bawah ini | None | Menetapkan fungsi dan argumen untuk menelepon ketika ReactionButton dengan ReactionButton.Type.CALLER ditekan |
event | ReactionButton.Event | None | Tentukan kapan tombol harus dilepas tergantung pada berapa kali ditekan |
skip | ReactionButton.Skip | None | Atur tindakan dan jumlah halaman untuk dilewati saat menggunakan linked_to dari ReactionButton.Type.SKIP . Misalnya menggunakan jenis tombol ini, mengatur tindakan ke "+" dan jumlah 3. Jika Anda berada di "halaman 1/20", tekan tombol itu akan membawa Anda ke "halaman 4/20" |
| Milik | Tipe pengembalian | Info |
|---|---|---|
clicked_by | Set[discord.Member] | Anggota yang mengklik tombol |
total_clicks | int | Jumlah klik dari tombol |
last_clicked | Optional[datetime.datetime] | Waktu di UTC saat tombol terakhir diklik |
menu | Optional[ReactionMenu] | Menu tombol dilampirkan |
ReactionMenu.add_button(button: ReactionButton)ReactionMenu.remove_all_buttons()ReactionMenu.remove_button(button: ReactionButton)ReactionMenu.get_button(identity: Union[str, int], *, search_by='name')ReactionButton.set_caller_details(func: Callable[..., None], *args, **kwargs)| Jenis | Info |
|---|---|
ReactionButton.Type.NEXT_PAGE | Buka halaman berikutnya di sesi menu |
ReactionButton.Type.PREVIOUS_PAGE | Buka halaman sebelumnya di sesi menu |
ReactionButton.Type.GO_TO_FIRST_PAGE | Buka halaman pertama di sesi menu |
ReactionButton.Type.GO_TO_LAST_PAGE | Buka halaman terakhir di sesi menu |
ReactionButton.Type.GO_TO_PAGE | Meminta Anda untuk mengetik halaman yang ingin Anda kunjungi |
ReactionButton.Type.END_SESSION | Hentikan sesi dan hapus pesan menu |
ReactionButton.Type.CUSTOM_EMBED | Digunakan secara terpisah dari tombol navigasi. Setelah ditekan, pergi ke embed yang ditentukan |
ReactionButton.Type.CALLER | Digunakan saat menentukan fungsi untuk menelepon dan argumennya saat tombol ditekan |
ReactionButton.Type.SKIP | Digunakan untuk memberi paginasi melalui beberapa halaman dalam satu tombol tekan |
Anda dapat menambahkan tombol (reaksi) ke menu menggunakan ReactionButton . Di bawah ini adalah contoh tentang cara menggunakan setiap ButtonType .
Catatan: Reaksibuttons dengan
ReactionButton.Type.CALLERsedikit berbeda, jadi ada bagian khusus yang menjelaskan cara kerjanya dan cara mengimplementasikannya lebih lanjut di bawah ini
menu = ReactionMenu (...)
# first and last pages
fpb = ReactionButton ( emoji = '⏪' , linked_to = ReactionButton . Type . GO_TO_FIRST_PAGE )
lpb = ReactionButton ( emoji = '⏩' , linked_to = ReactionButton . Type . GO_TO_LAST_PAGE )
# go to page
gtpb = ReactionButton ( emoji = '?' , linked_to = ReactionButton . Type . GO_TO_PAGE )
# end session
esb = ReactionButton ( emoji = '⏹️' , linked_to = ReactionButton . Type . END_SESSION )
# custom embed
ceb = ReactionButton ( emoji = '?' , linked_to = ReactionButton . Type . CUSTOM_EMBED , embed = discord . Embed ( title = 'Hello' ))
# skip button
sb = ReactionButton ( emoji = '5️⃣' , linked_to = ReactionButton . Type . SKIP , skip = ReactionButton . Skip ( action = '+' , amount = 5 ))
menu . add_button ( fpb )
... Hapus semua tombol dengan menu.remove_all_buttons() . Anda juga dapat menghapus tombol individual menggunakan namanya jika Anda memilikinya, atau objek tombol itu sendiri dengan menu.remove_button()
ReactionButton.Type.CALLER Tombol digunakan untuk mengimplementasikan fungsionalitas Anda sendiri ke dalam menu. Mungkin Anda ingin menambahkan tombol yang membuat saluran teks, mengirim pesan, atau menambahkan sesuatu ke database, apa pun itu. Untuk bekerja dengan ReactionButton.Type.CALLER , gunakan metode kelas di bawah ini.
ReactionButton.set_caller_details(func: Callable[..., None], *args, **kwargs) Metode kelas ini digunakan untuk mengatur fungsi dan argumen yang kemudian dipanggil ketika tombol ditekan. Konstruktor ReactionButton memiliki details KWARG, dan itulah yang akan Anda gunakan dengan .set_caller_details() untuk menetapkan nilai yang diperlukan. Beberapa contoh di bawah ini tentang cara mengimplementasikan ReactionButton.Type.CALLER dengan benar.type.caller
@ bot . command ()
async def user ( ctx , name , * , message ):
await ctx . send ( f"Hi { name } ! { message } . We're glad you're here!" )
def car ( year , make , model ):
print ( f"I have a { year } { make } { model } " )
ub = ReactionButton ( emoji = '' , linked_to = ReactionButton . Type . CALLER , details = ReactionButton . set_caller_details ( user , ctx , 'Defxult' , message = 'Welcome to the server' ))
cb = ReactionButton ( emoji = '?' , linked_to = ReactionButton . Type . CALLER , details = ReactionButton . set_caller_details ( car , 2021 , 'Ford' , 'Mustang' ))Catatan: Fungsi yang Anda lewati tidak boleh mengembalikan apa pun. Fungsi panggilan dengan
ReactionButton.Type.CALLERtidak menyimpan atau menangani apa pun yang dikembalikan oleh fungsi itu
Kelas ReactionButton hadir dengan metode yang ditetapkan (metode kelas) yang mengembalikan ReactionButton dengan parameter yang ditetapkan sesuai dengan linked_to mereka.
ReactionButton.back()emoji : "linked_to : ReactionButton.Type.PREVIOUS_PAGEReactionButton.next()emoji : "linked_to : ReactionButton.Type.NEXT_PAGEReactionButton.go_to_first_page()emoji : "⏪"linked_to : ReactionButton.Type.GO_TO_FIRST_PAGEReactionButton.go_to_last_page()emoji : "⏩"linked_to : ReactionButton.Type.GO_TO_LAST_PAGEReactionButton.go_to_page()emoji : "?"linked_to : ReactionButton.Type.GO_TO_PAGEReactionButton.end_session()emoji : "⏹️"linked_to : ReactionButton.Type.END_SESSIONReactionButton.all()list ReactionButton dalam urutan berikut.go_to_first_page() .back() .next() .go_to_last_page() .go_to_page() .end_session()ReactionButton.generate_skip(emoji: str, action: str, amount: int)emoji : <emoji>linked_to : ReactionButton.Type.SKIPskip : ReactionButton.Skip(<action>, <amount>)Jika Anda mau, Anda dapat membatasi jumlah menu reaksi yang dapat aktif pada saat yang sama per "guild", "anggota", atau "saluran"
ReactionMenu.set_sessions_limit(limit: int, per='guild', message='Too many active menus. Wait for other menus to be finished.')ReactionMenu.remove_limit()Contoh:
@ bot . command ()
async def limit ( ctx ):
ReactionMenu . set_sessions_limit ( 3 , per = 'member' , message = 'Sessions are limited to 3 per member' )Dengan contoh di atas, hanya 3 menu yang dapat aktif sekaligus untuk setiap anggota, dan jika mereka mencoba membuat lebih banyak sebelum menu mereka yang lain selesai, mereka akan mendapatkan pesan kesalahan yang mengatakan "Sesi dibatasi hingga 3 per anggota".
Anda dapat mengatur ReactionButton untuk dihapus ketika telah ditekan beberapa kali tertentu
class ReactionButton.Event(event_type: str, value: int)
event_type ( str ) Tindakan yang harus diambil. Satu -satunya opsi yang tersedia adalah "hapus"value ( int ) Jumlah yang ditetapkan untuk acara yang ditentukan. Harus menjadi> = 1. Jika nilai <= 0, secara implisit diatur ke 1Contoh:
menu = ReactionMenu ( ctx , ...)
# remove a button after 10 clicks
button = ReactionButton (..., event = ReactionButton . Event ( 'remove' , 10 ))
menu . add_button ( button )Catatan: Tidak ideal untuk tombol dengan
linked_todariReactionButton.Type.END_SESSION
Relay menu adalah fungsi yang disebut kapan saja tombol yang terpisah dari menu ditekan. Ini dianggap sebagai perpanjangan dari ReactionButton dengan linked_to ReactionButton.Type.CALLER . Tidak seperti tombol penelepon yang tidak memberikan detail tentang interaksi pada menu, relay lakukan.
ReactionMenu.set_relay(func: Callable[[NamedTuple], None], *, only: Optional[List[ReactionButton]]=None)ReactionMenu.remove_relay() Saat membuat fungsi untuk relai Anda, fungsi itu harus berisi argumen posisi tunggal. Ketika tombol ditekan, objek RelayPayload (tuple bernama) diteruskan ke fungsi itu. Atribut RelayPayload adalah:
member ( discord.Member ) Orang yang menekan tombolbutton ( ReactionButton ) tombol yang ditekanContoh:
async def enter_giveaway ( payload ):
member = payload . member
channel = payload . button . menu . message . channel
await channel . send ( f" { member . mention } , you've entered the giveaway!" )
menu = ReactionMenu ( ctx , ...)
menu . set_relay ( enter_giveaway ) Metode set_relay hadir dengan only parameter. Jika parameter itu None , semua tombol yang ditekan akan disampaikan. Anda dapat memberikan list tombol ke parameter itu sehingga hanya tombol yang menekan dari tombol yang ditentukan yang akan disampaikan.
def example ( payload ):
...
menu = ReactionMenu ( ctx , ...)
back_button = ReactionButton . back ()
next_button = ReactionButton . next ()
menu . set_relay ( example , only = [ back_button ])await ReactionMenu.start(*, send_to=None, reply=False)await ReactionMenu.stop(*, delete_menu_message=False, clear_reactions=False) Saat memulai menu, Anda memiliki opsi untuk mengirim menu ke saluran tertentu. Parameter send_to adalah saluran yang ingin Anda kirimkan pada menu. Anda dapat mengatur send_to sebagai nama saluran ( str ), ID saluran ( int ), atau objek saluran ( discord.TextChannel / discord.Thread ). Contoh:
menu = ReactionMenu (...)
# channel name
await menu . start ( send_to = 'bot-commands' )
# channel ID
await menu . start ( send_to = 1234567890123456 )
# channel object
channel = guild . get_channel ( 1234567890123456 )
await menu . start ( send_to = channel )
# there's no need to specify send_to unless you want the menu to be sent to a different channel
# from the one you're sending the initial message/using the command in. the menu can be started
# in the current channel by omitting the send_to parameter
await menu . start ()Catatan:
send_totidak valid jika menu dimulai di DM
Berikut adalah implementasi dasar dari ReactionMenu yang dapat Anda salin & tempel untuk demonstrasi cepat.
import asyncio
import discord
from discord . ext import commands
from reactionmenu import ReactionMenu , ReactionButton
bot = commands . Bot ( command_prefix = '!' , intents = discord . Intents . all ())
async def start_bot ():
async with bot :
await bot . start ( '...' )
@ bot . command ()
async def example ( ctx ):
menu = ReactionMenu ( ctx , menu_type = ReactionMenu . TypeEmbed )
for member in ctx . guild . members :
if member . avatar :
embed = discord . Embed ( description = f'Joined { member . joined_at . strftime ( "%b. %d, %Y" ) } ' )
embed . set_author ( name = member . name , icon_url = member . avatar . url )
menu . add_page ( embed )
menu . add_button ( ReactionButton . back ())
menu . add_button ( ReactionButton . next ())
menu . add_button ( ReactionButton . end_session ())
await menu . start ()
asyncio . run ( start_bot ()) class reactionmenu.ViewMenu(method: Union[Context, discord.Interaction], /, *, menu_type: MenuType, **kwargs)
ViewMenu adalah menu yang menggunakan fitur Tombol Perselisihan. Dengan tombol, Anda dapat mengaktifkan dan menonaktifkannya, mengatur warna tertentu untuk mereka dengan emoji, memiliki tombol yang mengirim pesan tersembunyi, dan menambahkan hyperlink. Perpustakaan ini menawarkan rentang fungsi yang lebih luas seperti yang menekan tombol, berapa kali ditekan dan banyak lagi. Ini menggunakan tampilan ( discord.ui.View ) untuk mengimplementasikan fungsionalitas tombol, tetapi menggunakan beberapa metode sendiri untuk membuat menu pagination tombol sederhana.
from reactionmenu import ViewMenu , ViewButtonmethod ( Union[discord.ext.commands.Context, discord.Interaction] ) Objek konteks atau interaksimenu_type ( MenuType ) Konfigurasi menuViewMenu.TypeEmbed , menu pagination sematan normalViewMenu.TypeEmbedDynamic , menu pagination embed dengan data dinamisViewMenu.TypeText , menu pagination saja teks| Nama | Jenis | Nilai default | Digunakan untuk | Info |
|---|---|---|---|---|
wrap_in_codeblock | str | None | ViewMenu.TypeEmbedDynamic | Pengidentifikasi bahasa CodeBlock Discord untuk membungkus data Anda. Contoh: ViewMenu(ctx, ..., wrap_in_codeblock='py') |
custom_embed | discord.Embed | None | ViewMenu.TypeEmbedDynamic | Embed objek untuk digunakan saat menambahkan data dengan ViewMenu.add_row() . Digunakan untuk tujuan gaya |
delete_on_timeout | bool | False | All menu types | Hapus menu saat keluar |
disable_items_on_timeout | bool | True | All menu types | Nonaktifkan item pada menu saat menu habis |
remove_items_on_timeout | bool | False | All menu types | Hapus item pada menu saat menu habis |
only_roles | List[discord.Role] | None | All menu types | Jika diatur, hanya anggota dengan peran yang diberikan yang diizinkan untuk mengontrol menu. Pemilik menu selalu dapat mengontrol menu |
timeout | Union[int, float, None] | 60.0 | All menu types | Pengatur waktu saat menu habis. None bisa tanpa batas waktu |
show_page_director | bool | True | All menu types | Ditampilkan di bagian bawah setiap halaman sematan. "Halaman 1/20" |
name | str | None | All menu types | Nama yang dapat Anda atur untuk menu |
style | str | "Page $/&" | All menu types | Gaya sutradara halaman khusus yang dapat Anda pilih. "$" mewakili halaman saat ini, "&" mewakili jumlah total halaman. Contoh: ViewMenu(ctx, ..., style='On $ out of &') |
all_can_click | bool | False | All menu types | Set jika semua orang diizinkan untuk mengontrol ketika halaman 'diputar' saat tombol diklik |
delete_interactions | bool | True | All menu types | Hapus Pesan Prompt oleh Bot dan Pesan Respons oleh pengguna saat ditanya halaman apa yang ingin mereka kunjungi saat menggunakan ViewButton.ID_GO_TO_PAGE |
rows_requested | int | None | ViewMenu.TypeEmbedDynamic | Jumlah informasi per ViewMenu.add_row() Anda ingin diterapkan pada setiap halaman embed |
Bergantung pada menu_type , halaman dapat berupa str , discord.Embed , atau kombinasi content atau files (contoh di bawah)
menu_type adalah ViewMenu.TypeEmbed , gunakan embedsmenu_type adalah ViewMenu.TypeText (hanya menu teks) atau ViewMenu.TypeEmbedDynamic (hanya menu embed), gunakan string.ViewMenu.add_page(embed: discord.Embed=MISSING, content: Optional[str]=None, files: Optional[Sequence[discord.File]]=None)ViewMenu.add_pages(pages: Sequence[Union[discord.Embed, str]])ViewMenu.add_row(data: str)ViewMenu.remove_all_pages()ViewMenu.clear_all_row_data()ViewMenu.remove_page(page_number: int)ViewMenu.set_main_pages(*embeds: Embed)ViewMenu.set_last_pages(*embeds: Embed) # ViewMenu.TypeEmbed
menu = ViewMenu ( method , menu_type = ViewMenu . TypeEmbed )
menu . add_page ( summer_embed )
menu . add_page ( winter_embed )
# ViewMenu.TypeText
menu = ViewMenu ( method , menu_type = ViewMenu . TypeText )
menu . add_page ( content = 'Its so hot!' )
menu . add_page ( content = 'Its so cold!' ) Menu TypeText adalah menu pagination berbasis teks. Tidak ada embed yang terlibat dalam proses pagination, hanya teks biasa yang digunakan.
Dengan v3.1.0+ , Anda dapat memberi paginasi dengan lebih dari sekedar embed atau teks. Anda dapat menggabungkan teks, embed, serta file. Tetapi tergantung pada menu_type kombinasi dapat dibatasi. Berikut adalah contoh menu dengan menu_type TypeEmbed yang ditumpuk.
# You can use regular commands as well
@ bot . tree . command ( description = "These are stacked pages" , guild = discord . Object ( id = ...))
async def stacked ( interaction : discord . Interaction ):
menu = ViewMenu ( interaction , menu_type = ViewMenu . TypeEmbed )
menu . add_page ( discord . Embed ( title = "My Embed" ), content = "This content is stacked on top of a file" , files = [ discord . File ( "stacked.py" )])
menu . add_page ( discord . Embed ( title = "Hey Wumpos, can you say hi to the person reading this? ?" ))
menu . add_page ( discord . Embed ( title = "Hi, I'm Wumpos!" ), files = [ discord . File ( "wumpos.gif" )])
menu . add_button ( ViewButton . back ())
menu . add_button ( ViewButton . next ())
await menu . start () Karena menu_type TypeEmbed , harus selalu ada sematan pada setiap halaman. Jika menu_type adalah TypeText , embed tidak diizinkan dan Anda akan dibatasi hanya menggunakan parameter files .
Menu dinamis digunakan ketika Anda tidak tahu berapa banyak informasi yang akan diterapkan pada menu. Misalnya, jika Anda meminta informasi dari database, informasi itu selalu dapat berubah. Anda menanyakan sesuatu dan Anda mungkin mendapatkan 1.500 hasil kembali, dan berikutnya mungkin hanya 800. Menu dinamis menyatukan semua informasi ini untuk Anda dan menambahkannya ke halaman embed dengan baris data. ViewMenu.add_row() paling baik digunakan dalam semacam Iterable di mana semuanya dapat diatasi, tetapi hanya menambahkan jumlah data yang Anda inginkan ke halaman menu.
CATATAN: Dalam menu dinamis, semua data yang ditambahkan ditempatkan di bagian deskripsi dari embed. Jika Anda memilih untuk menggunakan
custom_embed, semua teks dalam deskripsi akan ditimpa dengan data yang Anda tambahkan
ViewMenu.add_row(data: str)ViewMenu.clear_all_row_data()ViewMenu.set_main_pages(*embeds: Embed)ViewMenu.set_last_pages(*embeds: Embed)rows_requested - Jumlah baris yang Anda inginkan di setiap halaman embed sebelum membuat halaman baruViewMenu(..., rows_requested=5)custom_embed - Embed yang telah Anda buat untuk digunakan sebagai halaman sematan. Digunakan untuk estetika menu AndaViewMenu(..., custom_embed=red_embed)wrap_in_codeblock - pengidentifikasi bahasa saat membungkus data Anda di CodeBlock Perselisihan.ViewMenu(..., wrap_in_codeblock='py') menu = ViewMenu ( ctx , menu_type = ViewMenu . TypeEmbedDynamic , rows_requested = 5 )
for data in database . request ( 'SELECT * FROM customers' ):
menu . add_row ( data ) Anda dapat menghapus semua data yang telah Anda tambahkan ke menu dengan menggunakan menu.clear_all_row_data()
Saat menggunakan menu dinamis, satu -satunya halaman sematan yang Anda lihat adalah dari data yang telah Anda tambahkan. Tetapi jika Anda ingin menampilkan lebih banyak halaman selain data, Anda dapat menggunakan metode ViewMenu.set_main_pages() dan ViewMenu.set_last_pages() . Mengatur halaman utama, embed yang Anda setel akan menjadi embed pertama yang ditampilkan saat menu dimulai. Mengatur halaman terakhir adalah embed terakhir yang ditampilkan
menu . set_main_pages ( welcome_embed , announcement_embed )
for data in get_information ():
menu . add_row ( data )
menu . set_last_pages ( additional_info_embed )
# NOTE: setting main/last pages can be set in any orderTombol adalah apa yang Anda gunakan untuk berinteraksi dengan menu. Tidak seperti reaksi, mereka terlihat lebih bersih, memberikan masalah batas tingkat yang lebih sedikit, dan menawarkan lebih banyak dalam hal interaksi. Aktifkan dan nonaktifkan tombol, gunakan hyperlink penurunan harga di pesannya, dan bahkan mengirim pesan tersembunyi.
ViewMenu.add_button(button: ViewButton)ViewMenu.disable_all_buttons()ViewMenu.disable_button(button: ViewButton)ViewMenu.enable_all_buttons()ViewMenu.enable_button(button: ViewButton)ViewMenu.get_button(identity: str, *, search_by='label')ViewMenu.remove_all_buttons()ViewMenu.remove_button(button: ViewButton)await ViewMenu.refresh_menu_items() class reactionmenu.ViewButton(*, style=discord.ButtonStyle.secondary, label=None, disabled=False, custom_id=None, url=None, emoji=None, followup=None, event=None, **kwargs)
ViewButton adalah kelas yang mewakili tombol Perselisihan. Ini adalah subclass dari discord.ui.Button .
Berikut ini adalah aturan yang ditetapkan oleh Discord untuk tombol:
custom_id , dan tidak dapat memiliki urlurl , dan tidak dapat memiliki custom_idstyle ( discord.ButtonStyle ) Gaya tombollabel ( str ) Teks pada tombolcustom_id ( str ) ID untuk menentukan tindakan apa yang harus diambil tombol itu. ID yang tersedia:ViewButton.ID_NEXT_PAGEViewButton.ID_PREVIOUS_PAGEViewButton.ID_GO_TO_FIRST_PAGEViewButton.ID_GO_TO_LAST_PAGEViewButton.ID_GO_TO_PAGEViewButton.ID_END_SESSIONViewButton.ID_CALLERViewButton.ID_SEND_MESSAGEViewButton.ID_CUSTOM_EMBEDViewButton.ID_SKIPemoji ( Union[str, discord.PartialEmoji] ) emoji digunakan untuk tombolViewButton(..., emoji='?')ViewButton(..., emoji='<:miscTwitter:705423192818450453>')ViewButton(..., emoji='U000027a1')ViewButton(..., emoji='N{winking face}')url ( str ) URL untuk tombol dengan Discord discord.ButtonStyle.linkdisabled ( bool ) jika tombol harus dinonaktifkanfollowup ( ViewButton.Followup ) Pesan yang dikirim setelah tombol ditekan. Hanya tersedia untuk tombol yang memiliki custom_id ViewButton.ID_CALLER atau ViewButton.ID_SEND_MESSAGE . ViewButton.Followup adalah kelas yang memiliki parameter mirip dengan discord.abc.Messageable.send() , dan digunakan untuk mengontrol jika pesan fana, berisi file, embed, tts, dll ...event ( ViewButton.Event ) mengatur tombol untuk dinonaktifkan atau dihapus ketika telah ditekan beberapa kali tertentu | Nama | Jenis | Nilai default | Digunakan untuk |
|---|---|---|---|
name | str | None | Nama tombolnya |
skip | ViewButton.Skip | None | Atur tindakan dan jumlah halaman untuk dilewati saat menggunakan custom_id ViewButton.ID_SKIP . Misalnya, mengatur tindakan ke "+" dan jumlah 3. Jika Anda berada di "halaman 1/20", menekan tombol itu akan membawa Anda ke "halaman 4/20" |
persist | bool | False | Mencegah tombol tautan agar dinonaktifkan/dihapus saat menu kali keluar atau dihentikan sehingga mereka dapat tetap dapat diklik |
| Milik | Tipe pengembalian | Info |
|---|---|---|
clicked_by | Set[discord.Member] | Anggota yang mengklik tombol |
total_clicks | int | Jumlah klik dari tombol |
last_clicked | Optional[datetime.datetime] | Waktu di UTC saat tombol terakhir diklik |
menu | Optional[ViewMenu] | Menu tombol dilampirkan |
from reactionmenu import ViewMenu , ViewButton
menu = ViewMenu ( ctx , menu_type = ViewMenu . TypeEmbed )
# Link button
link_button = ViewButton ( style = discord . ButtonStyle . link , emoji = '?' , label = 'Link to Google' , url = 'https://google.com' )
menu . add_button ( link_button )
# Skip button
skip = ViewButton ( style = discord . ButtonStyle . primary , label = '+5' , custom_id = ViewButton . ID_SKIP , skip = ViewButton . Skip ( action = '+' , amount = 5 ))
menu . add_button ( skip )
# ViewButton.ID_PREVIOUS_PAGE
back_button = ViewButton ( style = discord . ButtonStyle . primary , label = 'Back' , custom_id = ViewButton . ID_PREVIOUS_PAGE )
menu . add_button ( back_button )
# ViewButton.ID_NEXT_PAGE
next_button = ViewButton ( style = discord . ButtonStyle . secondary , label = 'Next' , custom_id = ViewButton . ID_NEXT_PAGE )
menu . add_button ( next_button )
# All other ViewButton are created the same way as the last 2 EXCEPT
# 1 - ViewButton.ID_CALLER
# 2 - ViewButton.ID_SEND_MESSAGE
# 3 - ViewButton.ID_CUSTOM_EMBED
# ViewButton.ID_CALLER
def say_hello ( name : str ):
print ( 'Hello' , name )
call_followup = ViewButton . Followup ( details = ViewButton . Followup . set_caller_details ( say_hello , 'John' ))
menu . add_button ( ViewButton ( label = 'Say hi' , custom_id = ViewButton . ID_CALLER , followup = call_followup ))
# ViewButton.ID_SEND_MESSAGE
msg_followup = ViewButton . Followup ( 'This message is hidden!' , ephemeral = True )
menu . add_button ( ViewButton ( style = discord . ButtonStyle . green , label = 'Message' , custom_id = ViewButton . ID_SEND_MESSAGE , followup = msg_followup ))
# ViewButton.ID_CUSTOM_EMBED
custom_embed_button = ViewButton ( style = discord . ButtonStyle . blurple , label = 'Social Media Info' , custom_id = ViewButton . ID_CUSTOM_EMBED , followup = ViewButton . Followup ( embed = discord . Embed (...)))Catatan: Ketika datang ke tombol dengan
custom_idViewButton.ID_CALLER,ViewButton.ID_SEND_MESSAGE,ViewButton.ID_CUSTOM_EMBED, atau tombol tautan, Anda dapat menambahkan sebanyak yang Anda inginkan selama total 25 tombol atau kurang. Untuk semua ID tombol lainnya, setiap menu hanya dapat memilikinya.
Select digunakan saat Anda ingin mengkategorikan informasi di menu Anda. Selects hanya dapat digunakan saat menu_type menu TypeEmbed . Anda harus ingat bahwa keterbatasan perselisihan pada berapa banyak item UI menu (baris) dapat diterapkan pada setiap pesan.
Page.from_embeds(embeds: Sequence[Embed])ViewMenu.add_select(select: ViewSelect)ViewMenu.remove_select(select: ViewSelect)ViewMenu.remove_all_selects()ViewMenu.disable_select(select: ViewSelect)ViewMenu.disable_all_selects()ViewMenu.enable_select(select: ViewSelect)ViewMenu.enable_all_selects()ViewMenu.get_select(title: Union[str, None])Contoh:
from reactionmenu import ViewMenu , ViewSelect , Page
menu = ViewMenu ( ctx , menu_type = ViewMenu . TypeEmbed )
menu . add_page ( discord . Embed ( title = "A showcase of console video games" , color = discord . Color . blurple ()))
menu . add_select ( ViewSelect ( title = "Console Video Games" , options = {
# NOTE: The discord.SelectOption parameter "default" cannot be set to True
discord . SelectOption ( label = "PlayStation" , emoji = "<:PlayStation:549638412538478602>" ) : [
Page ( embed = discord . Embed ( title = "Ratchet & Clank" , description = ..., color = discord . Color . yellow ()). set_image ( url = ...)),
Page ( embed = discord . Embed ( title = "God of War" , description = ..., color = discord . Color . blue ()). set_image ( url = ...))
],
discord . SelectOption ( label = "Xbox" , emoji = "<:Xbox:501880493285834752>" ) : [
Page ( embed = discord . Embed ( title = "Halo Infinite" , description = ..., color = discord . Color . green ()). set_image ( url = ...)),
Page ( embed = discord . Embed ( title = "Gears of War 4" , description = ..., color = discord . Color . red ()). set_image ( url = ...))
]
}))
menu . add_button ( ViewButton . back ())
menu . add_button ( ViewButton . next ())
await menu . start ()Anda dapat menggunakan jenis select ini saat Anda ingin menggunakan UI untuk memilih halaman untuk pergi.
ViewMenu.add_go_to_select(goto: ViewSelect.GoTo)ViewMenu.enable_go_to_select(goto: ViewSelect.GoTo)ViewMenu.enable_all_go_to_selects()ViewMenu.disable_go_to_select(goto: ViewSelect.GoTo)ViewMenu.disable_all_go_to_selects()ViewMenu.remove_go_to_select(goto: ViewSelect.GoTo)ViewMenu.remove_all_go_to_selects() Parameter page_numbers untuk ViewSelect.GoTo dapat digunakan dengan 3 jenis yang berbeda
List[int] Jika diatur ke daftar bilangan bulat, nilai -nilai yang ditentukan adalah satu -satunya opsi yang tersedia saat pilih diklikpage_numbers=[1, 5, 10]Dict[int, Union[str, discord.Emoji, discord.PartialEmoji]] Anda dapat menggunakan jenis ini jika Anda ingin menggunakan emoji di pilihan Andapage_numbers={1 : "?️", 2 : ""}ellipsis Anda dapat mengatur ellipsis literal agar perpustakaan secara otomatis menetapkan semua nomor halaman ke jumlah halaman yang telah Anda tambahkan ke menu. Ini bisa berguna jika Anda memiliki 25 halaman atau kurangpage_numbers=...CATATAN : Mengatur parameter
page_numberske ellipsis (...) hanya berfungsi sebagaimana dimaksud jika Anda telah menambahkan Go to Select setelah Anda menambahkan halaman ke menu
@ bot . command ()
async def navigate ( ctx ):
menu = ViewMenu ( ctx , menu_type = ViewMenu . TypeEmbed )
menu . add_page ( discord . Embed ( title = "Twitter" ). set_image ( url = "..." ))
menu . add_page ( discord . Embed ( title = "YouTube" ). set_image ( url = "..." ))
menu . add_page ( discord . Embed ( title = "Discord" ). set_image ( url = "..." ))
# ...
menu . add_go_to_select ( ViewSelect . GoTo ( title = "Go to page..." , page_numbers = ...))
menu . add_button ( ViewButton . back ())
menu . add_button ( ViewButton . next ())
await menu . start ()await ViewMenu.refresh_menu_items()await ViewMenu.update(*, new_pages: Union[List[Union[Embed, str]], None], new_buttons: Union[List[ViewButton], None]) Saat menu berjalan, Anda dapat memperbarui halaman atau tombol pada menu. Menggunakan ViewMenu.update() , Anda dapat mengganti halaman dan tombol. Menggunakan ViewMenu.refresh_menu_items() memperbarui tombol yang telah Anda ubah.
@ bot . command ()
async def menu ( ctx ):
menu = ViewMenu (..., name = 'test' )
link_button = ViewButton (..., label = 'Link' )
menu . add_button ( link_button )
menu . add_page (...)
await menu . start ()
@ bot . command ()
async def disable ( ctx ):
menu = ViewMenu . get_session ( 'test' )
link_button = menu [ 0 ]. get_button ( 'Link' , search_by = 'label' )
menu . disable_button ( link_button )
await menu . refresh_menu_items () Jika tombol tidak disegarkan dengan ViewMenu.refresh_menu_items() , menu tidak akan diperbarui saat mengubah tombol.
Metode ViewMenu.update(...) digunakan saat Anda ingin mengganti semua atau beberapa tombol pada menu.
menu = ViewMenu (...)
# in a different .command()
await menu . update ( new_pages = [ hello_embed , goodbye_embed ], new_buttons = [ link_button , next_button ])Catatan : Saat menggunakan
ViewMenu.update(...), tidak perlu menggunakanViewMenu.refresh_menu_items()karena mereka diperbarui selama panggilan pembaruan.
Kelas ViewButton hadir dengan metode yang ditetapkan (metode kelas) yang mengembalikan ViewButton dengan parameter yang diatur sesuai dengan custom_id mereka (tidak termasuk tombol tautan).
ViewButton.link(label: str, url: str)style : discord.ButtonStyle.linklabel : <label>url : <url>ViewButton.back()style : discord.ButtonStyle.graylabel : "Kembali"custom_id : ViewButton.ID_PREVIOUS_PAGEViewButton.next()style : discord.ButtonStyle.graylabel : "Berikutnya"custom_id : ViewButton.ID_NEXT_PAGEViewButton.go_to_first_page()style : discord.ButtonStyle.graylabel : "Halaman Pertama"custom_id : ViewButton.ID_GO_TO_FIRST_PAGEViewButton.go_to_last_page()style : discord.ButtonStyle.graylabel : "Halaman Terakhir"custom_id : ViewButton.ID_GO_TO_LAST_PAGEViewButton.go_to_page()style : discord.ButtonStyle.graylabel : "Pilihan Halaman"custom_id : ViewButton.ID_GO_TO_PAGEViewButton.end_session()discord.ButtonStyle.grayViewButton.ID_END_SESSIONViewButton.all()list ViewButton dalam urutan berikut.go_to_first_page() .back() .next() .go_to_last_page() .go_to_page() .end_session()ViewButton.all_with_emojis()list ViewButton dengan parameter emoji mereka sudah diatur dalam urutan berikut.go_to_first_page() .back() .next() .go_to_last_page() .go_to_page() .end_session()ViewButton.generate_skip(label: str, action: str, amount: int)style : discord.ButtonStyle.graylabel : <label>custom_id : ViewButton.ID_SKIPskip : ViewButton.Skip(<action>, <amount>) menu = ViewMenu ( ctx , ...)
menu . add_page (...)
menu . add_page (...)
menu . add_button ( ViewButton . back ())
menu . add_button ( ViewButton . next ())
await menu . start () Anda dapat mengatur ViewButton untuk dinonaktifkan atau dihapus ketika telah ditekan beberapa kali tertentu
class ViewButton.Event(event_type: str, value: int)
event_type ( str ) Tindakan yang harus diambil. Bisa "nonaktifkan" atau "hapus"value ( int ) Jumlah yang ditetapkan untuk acara yang ditentukan. Harus menjadi> = 1. Jika nilai <= 0, secara implisit diatur ke 1Contoh:
menu = ViewMenu ( ctx , ...)
# disable a button after 5 clicks
button_1 = ViewButton (..., event = ViewButton . Event ( 'disable' , 5 ))
menu . add_button ( button_1 )
# remove a button after 10 clicks
button_2 = ViewButton (..., event = ViewButton . Event ( 'remove' , 10 ))
menu . add_button ( button_2 )Catatan: Tidak valid untuk tombol tautan. Juga tidak ideal untuk tombol dengan
custom_idViewButton.ID_END_SESSION
Relay menu adalah fungsi yang disebut kapan saja tombol yang terpisah dari menu ditekan. Ini dianggap sebagai perpanjangan dari ViewButton dengan id ViewButton.ID_CALLER . Tidak seperti tombol penelepon yang tidak memberikan detail tentang interaksi pada menu, relay lakukan.
ViewMenu.set_relay(func: Callable[[NamedTuple], None], *, only: Optional[List[ViewButton]]=None)ViewMenu.remove_relay() Saat membuat fungsi untuk relai Anda, fungsi itu harus berisi argumen posisi tunggal. Ketika tombol ditekan, objek RelayPayload (tuple bernama) diteruskan ke fungsi itu. Atribut RelayPayload adalah:
member ( discord.Member ) Orang yang menekan tombolbutton ( ViewButton ) tombol yang ditekanContoh:
async def enter_giveaway ( payload ):
member = payload . member
channel = payload . button . menu . message . channel
await channel . send ( f" { member . mention } , you've entered the giveaway!" )
menu = ViewMenu ( ctx , ...)
menu . set_relay ( enter_giveaway ) Metode set_relay hadir dengan only parameter. Jika parameter itu None , semua tombol yang ditekan akan disampaikan (kecuali tombol tautan karena mereka tidak mengirim acara interaksi). Anda dapat memberikan list tombol ke parameter itu sehingga hanya tombol yang menekan dari tombol yang ditentukan yang akan disampaikan.
def example ( payload ):
...
menu = ViewMenu ( ctx , ...)
back_button = ViewButton . back ()
next_button = ViewButton . next ()
menu . set_relay ( example , only = [ back_button ])await ViewMenu.start(*, send_to=None, reply=False)await ViewMenu.stop(*, delete_menu_message=False, remove_buttons=False, disable_buttons=False) Saat memulai menu, Anda memiliki opsi untuk mengirim menu ke saluran tertentu. Parameter send_to adalah saluran yang ingin Anda kirimkan pada menu. Anda dapat mengatur send_to sebagai nama saluran ( str ), ID saluran ( int ), atau objek saluran ( discord.TextChannel / discord.Thread ). Contoh:
menu = ViewMenu (...)
# channel name
await menu . start ( send_to = 'bot-commands' )
# channel ID
await menu . start ( send_to = 1234567890123456 )
# channel object
channel = guild . get_channel ( 1234567890123456 )
await menu . start ( send_to = channel )
# there's no need to specify send_to unless you want the menu to be sent to a different channel
# from the one you're sending the initial message/using the command in. the menu can be started
# in the current channel by omitting the send_to parameter
await menu . start ()Catatan:
send_totidak valid jika menu dimulai di DM
Hanya satu opsi yang tersedia saat menghentikan menu. Jika Anda memiliki beberapa parameter yang True , hanya satu yang akan mengeksekusi
delete_menu_message > disable_buttonsdisable_buttons > remove_buttons Berikut adalah implementasi dasar ViewMenu yang dapat Anda salin & tempel untuk demonstrasi cepat.
import asyncio
import discord
from discord . ext import commands
from reactionmenu import ViewMenu , ViewButton
bot = commands . Bot ( command_prefix = '!' , intents = discord . Intents . all ())
async def start_bot ():
async with bot :
await bot . start ( '...' )
@ bot . command ()
async def example ( ctx ):
menu = ViewMenu ( ctx , menu_type = ViewMenu . TypeEmbed )
for member in ctx . guild . members :
if member . avatar :
embed = discord . Embed ( description = f'Joined { member . joined_at . strftime ( "%b. %d, %Y" ) } ' )
embed . set_author ( name = member . name , icon_url = member . avatar . url )
menu . add_page ( embed )
menu . add_button ( ViewButton . back ())
menu . add_button ( ViewButton . next ())
menu . add_button ( ViewButton . end_session ())
await menu . start ()
asyncio . run ( start_bot ())