يمكنك تثبيت أحدث إصدار PYPI من المكتبة عن طريق القيام:
$ pip install reactionmenu
أو نسخة التطوير:
$ pip install git+https://github.com/Defxult/reactionmenu
الحد الأدنى النووي اللازمة
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 هي قائمة تستخدم الرموز التعبيرية التي هي إما رمز تعبيري نقابة مخصص أو رموز تعبيرية طبيعية للتحكم في عملية ترقيم الصفحات. إذا كنت لا تبحث عن أي من الميزات الفاخرة وتريد فقط شيئًا بسيطًا ، فهذا هو الشخص الذي يجب استخدامه.
from reactionmenu import ReactionMenu , ReactionButtonتأتي هذه المكتبة مع عدة طرق وخيارات من أجل جعل قائمة رد فعل Discord بسيطة. بمجرد استيراد الفئات المناسبة ، ستقوم بتهيئة المُنشئ مثل:
menu = ReactionMenu ( method , menu_type = ReactionMenu . TypeEmbed )method ( Union[discord.ext.commands.Context, discord.Interaction] ) سياق أو كائن تفاعلmenu_type ( MenuType ) تكوين القائمةReactionMenu.TypeEmbedReactionMenu.TypeEmbedDynamicReactionMenu.TypeText| اسم | يكتب | القيمة الافتراضية | تستخدم ل | معلومات |
|---|---|---|---|---|
wrap_in_codeblock | str | None | ReactionMenu.TypeEmbedDynamic | معرف لغة codeblock discord للف بياناتك في. مثال: ReactionMenu(ctx, ..., wrap_in_codeblock='py') |
custom_embed | discord.Embed | None | ReactionMenu.TypeEmbedDynamic | تضمين كائن لاستخدامه عند إضافة البيانات باستخدام ReactionMenu.add_row() . تستخدم لأغراض التصميم |
delete_on_timeout | bool | False | All menu types | احذف القائمة عندما تكون في الخارج |
clear_reactions_after | bool | True | All menu types | احذف جميع ردود الفعل بعد أوقات القائمة في الخارج |
navigation_speed | str | ReactionMenu.NORMAL | All menu types | مجموعات إذا احتاج المستخدم إلى انتظار رد الفعل بواسطة الروبوت قبل "تشغيل" الصفحة. ضبط السرعة على ReactionMenu.FAST |
only_roles | List[discord.Role] | None | All menu types | إذا تم تعيينه ، يُسمح فقط للأعضاء الذين لديهم أي من الأدوار المحددة بالتحكم في القائمة. يمكن لمالك القائمة دائمًا التحكم في القائمة |
timeout | Union[int, float, None] | 60.0 | All menu types | الموقت عندما تمر القائمة في الخارج. يمكن أن يكون None لعدم مهلة |
show_page_director | bool | True | All menu types | يظهر في أسفل كل صفحة التضمين. "صفحة 1/20" |
name | str | None | All menu types | اسم يمكنك تعيينه في القائمة |
style | str | "Page $/&" | All menu types | نمط مخصص لمخرج الصفحة يمكنك تحديده. يمثل "$" الصفحة الحالية ، "و" يمثل إجمالي المبلغ للصفحات. مثال: ReactionMenu(ctx, ..., style='On $ out of &') |
all_can_click | bool | False | All menu types | مجموعات إذا سمح للجميع بالتحكم عند "تشغيل" الصفحات عند النقر فوق الأزرار |
delete_interactions | bool | True | All menu types | احذف رسالة المطالبة بواسطة BOT ورسالة الاستجابة من قبل المستخدم عند سؤالها عن الصفحة التي يرغبون في الذهاب إليها عند استخدام ReactionButton.Type.GO_TO_PAGE |
rows_requested | int | None | ReactionMenu.TypeEmbedDynamic | مقدار المعلومات لكل ReactionMenu.add_row() |
remove_extra_emojis | bool | False | All menu types | إذا كان True ، فسيتم إضافة جميع الرموز التعبيرية (ردود الفعل) إلى رسالة القائمة التي لم تتم إضافتها في الأصل إلى القائمة |
اعتمادًا على menu_type ، يمكن أن تكون الصفحات إما str أو discord.Embed أو مجموعة من content files (مثال أدناه)
menu_type هي ReactionMenu.TypeEmbed ، فاستخدم التضمينReactionMenu.TypeEmbedDynamic كانت menu_type هي ReactionMenu.TypeText .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!' ) قائمة TypeText هي قائمة ترقيم ترقيم نصية. لا تتورط أي تضمين في عملية ترقيم الصفحات ، ويتم استخدام النص العادي فقط.
مع v3.1.0+ ، يمكنك التربط بأكثر من مجرد تضمين أو نص. يمكنك الجمع بين النص ، والتضمين ، وكذلك الملفات. ولكن بناءً على menu_type ، يمكن تقييد المجموعة. فيما يلي مثال على قائمة مع menu_type من TypeEmbed مكدسة.
# 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 () نظرًا لأن menu_type هو TypeEmbed ، يجب دائمًا أن يكون هناك تضمين في كل صفحة. إذا كانت menu_type TypeText ، فلا يسمح بالتضمينات وسيتم تقييدك على استخدام معلمة files فقط.
يتم استخدام قائمة ديناميكية عندما لا تعرف مقدار المعلومات التي سيتم تطبيقها على القائمة. على سبيل المثال ، إذا كنت ترغب في طلب المعلومات من قاعدة بيانات ، يمكن أن تتغير هذه المعلومات دائمًا. يمكنك الاستعلام عن شيء ما وقد تحصل على 1500 نتيجة مرة أخرى ، وربما 800 فقط. قائمة ديناميكية كل هذه المعلومات معًا وتضيفها إلى صفحة تضمين بواسطة صفوف من البيانات. من الأفضل استخدام ReactionMenu.add_row() في نوع Iterable كل شيء يمكن حلقه ، ولكن فقط أضف كمية البيانات التي تريدها إلى صفحة القائمة.
ملاحظة: في قائمة ديناميكية ، يتم وضع جميع البيانات المضافة في قسم الوصف من التضمين. إذا اخترت استخدام
custom_embed، فسيتم تجاوز كل النصوص في الوصف بالبيانات التي تضيفها
ReactionMenu.add_row(data: str)ReactionMenu.clear_all_row_data()ReactionMenu.set_main_pages(*embeds: Embed)ReactionMenu.set_last_pages(*embeds: Embed)rows_requested - مقدار الصفوف التي ترغب في كل صفحة تضمينها قبل إنشاء صفحة جديدةReactionMenu(..., rows_requested=5)custom_embed - تم تضمين قمت بإنشائه لاستخدامه كصفحات مضمنة. تستخدم لقائمتك الجماليةReactionMenu(..., custom_embed=red_embed)wrap_in_codeblock - معرف اللغة عند لف بياناتك في رمز DICEDBLOCK.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 ) يمكنك إزالة جميع البيانات التي أضفتها إلى قائمة باستخدام menu.clear_all_row_data()
عند استخدام قائمة ديناميكية ، فإن الصفحات المدمجة الوحيدة التي تراها هي من البيانات التي أضفتها. ولكن إذا كنت ترغب في إظهار المزيد من الصفحات بخلاف البيانات فقط ، فيمكنك استخدام Methods ReactionMenu.set_main_pages() و ReactionMenu.set_last_pages() . إعداد الصفحة (الصفحات) الرئيسية ، سيكون التضمين الذي تقوم بتعيينه أول التضمينات التي يتم عرضها عند بدء القائمة. تحديد آخر صفحة (صفحات) هي آخر التضمين المعروضة
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 orderيتم استخدام أنواع الأزرار/الأزرار عندما تريد إضافة رد فعل إلى القائمة التي تقوم بوظيفة معينة. تعمل الأزرار وأنواع الأزرار معًا لتحقيق الإجراء المطلوب.
class reactionmenu.ReactionButton(*, emoji: str, linked_to: ButtonType, **kwargs)
emoji ( str ) الرموز التعبيرية التي ترغب في استخدامها كرد فعلlinked_to ( ReactionButton.Type ) عند الضغط على التفاعل ، هذا هو ما يحدد ما ستفعله| اسم | يكتب | القيمة الافتراضية | تستخدم ل |
|---|---|---|---|
embed | discord.Embed | None | عند الضغط على التفاعل ، انتقل إلى التضمين المحدد |
name | str | None | اسم الزر |
details | معلومات أدناه | None | يعين الوظيفة والوسائط التي يجب الاتصال بها عندما يتم الضغط على ReactionButton مع ReactionButton.Type.CALLER |
event | ReactionButton.Event | None | حدد متى يجب إزالة الزر اعتمادًا على عدد المرات التي تم فيها الضغط عليه |
skip | ReactionButton.Skip | None | قم بتعيين الإجراء وكمية الصفحات لتخطيها عند استخدام linked_to of ReactionButton.Type.SKIP . على سبيل المثال ، باستخدام نوع الزر هذا ، قم بإعداد الإجراء على "+" والكمية 3. إذا كنت على "الصفحة 1/20" ، فإن الضغط على هذا الزر سيقلبك إلى "الصفحة 4/20" |
| ملكية | نوع العودة | معلومات |
|---|---|---|
clicked_by | Set[discord.Member] | الأعضاء الذين نقروا على الزر |
total_clicks | int | مقدار النقرات من الزر |
last_clicked | Optional[datetime.datetime] | الوقت في UTC عندما تم النقر على الزر آخر مرة |
menu | Optional[ReactionMenu] | القائمة المرفقة بالزر |
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)| يكتب | معلومات |
|---|---|
ReactionButton.Type.NEXT_PAGE | انتقل إلى الصفحة التالية في جلسة القائمة |
ReactionButton.Type.PREVIOUS_PAGE | انتقل إلى الصفحة السابقة في جلسة القائمة |
ReactionButton.Type.GO_TO_FIRST_PAGE | انتقل إلى الصفحة الأولى في جلسة القائمة |
ReactionButton.Type.GO_TO_LAST_PAGE | انتقل إلى الصفحة الأخيرة في جلسة القائمة |
ReactionButton.Type.GO_TO_PAGE | يطالبك بكتابة الصفحة التي ترغب في الذهاب إليها |
ReactionButton.Type.END_SESSION | يوقف الجلسة ويحذف رسالة القائمة |
ReactionButton.Type.CUSTOM_EMBED | تستخدم بشكل منفصل عن أزرار التنقل. بمجرد الضغط عليها ، انتقل إلى التضمين المحدد |
ReactionButton.Type.CALLER | تستخدم عند تحديد الوظيفة للاتصال والوسائط عند الضغط على الزر |
ReactionButton.Type.SKIP | تستخدم لتراجع من خلال صفحات متعددة في زر واحد اضغط |
يمكنك إضافة أزرار (تفاعلات) إلى القائمة باستخدام ReactionButton . فيما يلي أمثلة على كيفية استخدام كل ButtonType .
ملحوظة: تفاعل Beansbuttons مع
ReactionButton.Type.CALLERيختلف قليلاً ، لذلك هناك قسم مخصص يشرح كيفية عملهم وكيفية تنفيذها بشكل أكبر أدناه
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 )
... قم بإزالة جميع الأزرار باستخدام menu.remove_all_buttons() . يمكنك أيضًا إزالة زر فردي باستخدام اسمه إذا تم تعيينه ، أو كائن الزر نفسه باستخدام menu.remove_button()
يتم استخدام أزرار ReactionButton.Type.CALLER . ربما تريد إضافة زر ينشئ قناة نصية ، أو يرسل رسالة ، أو إضافة شيء إلى قاعدة بيانات ، مهما كانت. من أجل العمل مع ReactionButton.Type.CALLER ، استخدم طريقة الفصل أدناه.
ReactionButton.set_caller_details(func: Callable[..., None], *args, **kwargs) يتم استخدام طريقة الفئة هذه لإعداد وظيفة ، كما أن الوسائط التي يتم استدعاؤها لاحقًا عند الضغط على الزر. يحتوي مُنشئ ReactionButton على details KWARG ، وهذا ما ستستخدمه مع .set_caller_details() لتعيين القيم المطلوبة. بعض الأمثلة أدناه حول كيفية تنفيذ ReactionButton.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' ))ملاحظة: يجب ألا تُرجع الوظيفة التي تمر فيها أي شيء. لا يقوم استدعاء وظائف مع
ReactionButton.Type.CALLERلا يخزن أو يتعامل
تأتي فئة ReactionButton مع أساليب مصنع محددة (أساليب الفصل) التي تُرجع ReactionButton مع المعلمات المحددة وفقًا لـ linked_to .
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 بالترتيب التالي.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>)إذا كنت ترغب في ذلك ، يمكنك الحد من مقدار قوائم رد الفعل التي يمكن أن تكون نشطة في نفس الوقت لكل "نقابة" أو "عضو" أو "قناة"
ReactionMenu.set_sessions_limit(limit: int, per='guild', message='Too many active menus. Wait for other menus to be finished.')ReactionMenu.remove_limit()مثال:
@ bot . command ()
async def limit ( ctx ):
ReactionMenu . set_sessions_limit ( 3 , per = 'member' , message = 'Sessions are limited to 3 per member' )من خلال المثال أعلاه ، يمكن أن تكون 3 قوائم فقط نشطة في وقت واحد لكل عضو ، وإذا حاولوا إنشاء المزيد قبل الانتهاء من القائمة الأخرى ، فسوف يحصلون على رسالة خطأ تقول "الجلسات تقتصر على 3 لكل عضو".
يمكنك ضبط ReactionButton لإزالته عند الضغط عليه بمقدار معين من المرات
class ReactionButton.Event(event_type: str, value: int)
event_type ( str ) الإجراء الذي يجب اتخاذه. الخيار الوحيد المتاح هو "إزالة"value ( int ) المبلغ المحدد للحدث المحدد. يجب أن يكون> = 1. إذا كانت القيمة <= 0 ، فسيتم ضبطها ضمنيًا على 1مثال:
menu = ReactionMenu ( ctx , ...)
# remove a button after 10 clicks
button = ReactionButton (..., event = ReactionButton . Event ( 'remove' , 10 ))
menu . add_button ( button )ملاحظة: ليست مثالية للأزرار مع
linked_toofReactionButton.Type.END_SESSION
مرحلات القائمة هي وظائف تسمى في أي وقت يتم فيه الضغط على زر يكون بصرف النظر عن القائمة. يعتبر امتدادًا ReactionButton مع linked_to من ReactionButton.Type.CALLER . على عكس أزرار المتصل التي لا توفر تفاصيل حول التفاعلات في القائمة ، فإن المرحلات تفعل.
ReactionMenu.set_relay(func: Callable[[NamedTuple], None], *, only: Optional[List[ReactionButton]]=None)ReactionMenu.remove_relay() عند إنشاء وظيفة للتتابع الخاص بك ، يجب أن تحتوي هذه الوظيفة على وسيطة موضعية واحدة. عند الضغط على زر ، يتم تمرير كائن RelayPayload (tuple المسماة) إلى هذه الوظيفة. سمات RelayPayload هي:
member ( discord.Member ) الشخص الذي ضغط على الزرbutton ( ReactionButton ) الزر الذي تم الضغط عليهمثال:
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 ) تأتي طريقة set_relay مع المعلمة only . إذا None تكن هذه المعلمة ، فسيتم نقل جميع الأزرار التي يتم الضغط عليها. يمكنك توفير list من الأزرار لتلك المعلمة بحيث يتم نقل الزر فقط من تلك الأزرار المحددة.
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) عند بدء القائمة ، لديك خيار إرسال القائمة إلى قناة معينة. المعلمة send_to هي القناة التي ترغب في إرسال القائمة إلى. يمكنك تعيين send_to كاسم القناة ( str ) أو معرف القناة ( int ) أو كائن القناة ( discord.TextChannel / discord.Thread ). مثال:
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 ()ملاحظة:
send_toغير صالح إذا تم بدء قائمة في DM's
فيما يلي تطبيق أساسي لـ ReactionMenu يمكنك نسخه ولصقه لتقديم عرض سريع.
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 هي قائمة تستخدم ميزة أزرار Discords. باستخدام الأزرار ، يمكنك تمكينها وتعطيلها ، وتعيين لون معين لهم مع الرموز التعبيرية ، ولديها أزرار ترسل رسائل مخفية ، وإضافة الارتباطات التشعبية. توفر هذه المكتبة مجموعة واسعة من الوظائف مثل من الذي ضغط على الزر ، وعدد المرات التي تم فيها الضغط عليه وأكثر من ذلك. يستخدم طرق العرض ( discord.ui.View ) لتنفيذ وظيفة الأزرار ، ولكنها تستخدم بعض أساليبها الخاصة من أجل جعل قائمة ترقيم الأزرار بسيطة.
from reactionmenu import ViewMenu , ViewButtonmethod ( Union[discord.ext.commands.Context, discord.Interaction] ) سياق أو كائن تفاعلmenu_type ( MenuType ) تكوين القائمةViewMenu.TypeEmbed ، قائمة ترقيم ترقيم التضمين العاديةViewMenu.TypeEmbedDynamic ، قائمة ترقيم الصفحات مع بيانات ديناميكيةViewMenu.TypeText ، قائمة ترقيم الصفحات فقط| اسم | يكتب | القيمة الافتراضية | تستخدم ل | معلومات |
|---|---|---|---|---|
wrap_in_codeblock | str | None | ViewMenu.TypeEmbedDynamic | معرف لغة codeblock discord للف بياناتك في. مثال: ViewMenu(ctx, ..., wrap_in_codeblock='py') |
custom_embed | discord.Embed | None | ViewMenu.TypeEmbedDynamic | تضمين كائن لاستخدامه عند إضافة البيانات باستخدام ViewMenu.add_row() . تستخدم لأغراض التصميم |
delete_on_timeout | bool | False | All menu types | احذف القائمة عندما تكون في الخارج |
disable_items_on_timeout | bool | True | All menu types | قم بتعطيل العناصر الموجودة في القائمة عند عرض القائمة |
remove_items_on_timeout | bool | False | All menu types | قم بإزالة العناصر الموجودة في القائمة عند عرض القائمة |
only_roles | List[discord.Role] | None | All menu types | إذا تم تعيينه ، يُسمح فقط للأعضاء الذين لديهم أي من الأدوار المحددة بالتحكم في القائمة. يمكن لمالك القائمة دائمًا التحكم في القائمة |
timeout | Union[int, float, None] | 60.0 | All menu types | الموقت عندما تمر القائمة في الخارج. يمكن أن يكون None لعدم مهلة |
show_page_director | bool | True | All menu types | يظهر في أسفل كل صفحة التضمين. "صفحة 1/20" |
name | str | None | All menu types | اسم يمكنك تعيينه في القائمة |
style | str | "Page $/&" | All menu types | نمط مخصص لمخرج الصفحة يمكنك تحديده. يمثل "$" الصفحة الحالية ، "و" يمثل إجمالي المبلغ للصفحات. مثال: ViewMenu(ctx, ..., style='On $ out of &') |
all_can_click | bool | False | All menu types | مجموعات إذا سمح للجميع بالتحكم عند "تشغيل" الصفحات عند النقر فوق الأزرار |
delete_interactions | bool | True | All menu types | احذف رسالة المطالبة بواسطة BOT ورسالة الاستجابة من قبل المستخدم عند سؤالها عن الصفحة التي يرغبون في الذهاب إليها عند استخدام ViewButton.ID_GO_TO_PAGE |
rows_requested | int | None | ViewMenu.TypeEmbedDynamic | مقدار المعلومات لكل ViewMenu.add_row() الذي ترغب في تطبيقه على كل صفحة تضمين |
اعتمادًا على menu_type ، يمكن أن تكون الصفحات إما str أو discord.Embed أو مجموعة من content أو files (مثال أدناه)
menu_type هي ViewMenu.TypeEmbed ، فاستخدم التضمينmenu_type هي ViewMenu.TypeText (قائمة نصية فقط) أو ViewMenu.TypeEmbedDynamic (قائمة فقط) ، استخدم السلاسل.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!' ) قائمة TypeText هي قائمة ترقيم ترقيم نصية. لا تتورط أي تضمين في عملية ترقيم الصفحات ، ويتم استخدام النص العادي فقط.
مع v3.1.0+ ، يمكنك التربط بأكثر من مجرد تضمين أو نص. يمكنك الجمع بين النص ، والتضمين ، وكذلك الملفات. ولكن بناءً على menu_type ، يمكن تقييد المجموعة. فيما يلي مثال على قائمة مع menu_type من TypeEmbed مكدسة.
# 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 () نظرًا لأن menu_type هو TypeEmbed ، يجب دائمًا أن يكون هناك تضمين في كل صفحة. إذا كانت menu_type TypeText ، فلا يسمح بالتضمينات وسيتم تقييدك على استخدام معلمة files فقط.
يتم استخدام قائمة ديناميكية عندما لا تعرف مقدار المعلومات التي سيتم تطبيقها على القائمة. على سبيل المثال ، إذا كنت ترغب في طلب المعلومات من قاعدة بيانات ، يمكن أن تتغير هذه المعلومات دائمًا. يمكنك الاستعلام عن شيء ما وقد تحصل على 1500 نتيجة مرة أخرى ، وربما 800 فقط. قائمة ديناميكية كل هذه المعلومات معًا وتضيفها إلى صفحة تضمين بواسطة صفوف من البيانات. من الأفضل استخدام ViewMenu.add_row() في نوع Iterable من حيث يمكن الحصول على كل شيء ، ولكن فقط أضف كمية البيانات التي تريدها إلى صفحة القائمة.
ملاحظة: في قائمة ديناميكية ، يتم وضع جميع البيانات المضافة في قسم الوصف من التضمين. إذا اخترت استخدام
custom_embed، فسيتم تجاوز كل النصوص في الوصف بالبيانات التي تضيفها
ViewMenu.add_row(data: str)ViewMenu.clear_all_row_data()ViewMenu.set_main_pages(*embeds: Embed)ViewMenu.set_last_pages(*embeds: Embed)rows_requested - مقدار الصفوف التي ترغب في كل صفحة تضمينها قبل إنشاء صفحة جديدةViewMenu(..., rows_requested=5)custom_embed - تم تضمين قمت بإنشائه لاستخدامه كصفحات مضمنة. تستخدم لقائمتك الجماليةViewMenu(..., custom_embed=red_embed)wrap_in_codeblock - معرف اللغة عند لف بياناتك في رمز DICEDBLOCK.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 ) يمكنك إزالة جميع البيانات التي أضفتها إلى قائمة باستخدام menu.clear_all_row_data()
عند استخدام قائمة ديناميكية ، فإن الصفحات المدمجة الوحيدة التي تراها هي من البيانات التي أضفتها. ولكن إذا كنت ترغب في عرض المزيد من الصفحات بخلاف البيانات فقط ، فيمكنك استخدام Methods ViewMenu.set_main_pages() و ViewMenu.set_last_pages() . إعداد الصفحة (الصفحات) الرئيسية ، سيكون التضمين الذي تقوم بتعيينه أول التضمينات التي يتم عرضها عند بدء القائمة. تحديد آخر صفحة (صفحات) هي آخر التضمين المعروضة
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 orderالأزرار هي ما تستخدمه للتفاعل مع القائمة. على عكس ردود الفعل ، فإنها تبدو أنظف ، وتوفر مشكلات في الحد الأدنى للمعدل ، وتقدم المزيد من حيث التفاعلات. تمكين الأزرار وتعطيلها ، واستخدام ارتباطات تشعبية مقلوبة في رسائلها ، وحتى إرسال رسائل مخفية.
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 هو فئة تمثل زر Discord. إنها فئة فرعية من discord.ui.Button .
فيما يلي القواعد التي تم تحديدها بواسطة Discord for Buttons:
custom_id ، ولا يمكن أن يكون لها urlurl ، ولا يمكن أن يكون لديك custom_idstyle ( discord.ButtonStyle ) نمط الزرlabel ( str ) النص الموجود على الزرcustom_id ( str ) معرف لتحديد الإجراء الذي يجب أن يتخذه هذا الزر. معرفات متوفرة: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] ) تعاطي الرموز التعبيرية المستخدمة في الزرViewButton(..., emoji='?')ViewButton(..., emoji='<:miscTwitter:705423192818450453>')ViewButton(..., emoji='U000027a1')ViewButton(..., emoji='N{winking face}')url ( str ) url لزر مع نمط discord.ButtonStyle.linkdisabled ( bool ) إذا كان يجب تعطيل الزرfollowup ( ViewButton.Followup ) الرسالة المرسلة بعد الضغط على الزر. متاح فقط للأزرار التي تحتوي على custom_id من ViewButton.ID_CALLER أو ViewButton.ID_SEND_MESSAGE . ViewButton.Followup هي فئة تحتوي على معلمات مماثلة لـ discord.abc.Messageable.send() ، ويستخدم للتحكم إذا كانت الرسالة سريعة الزوال ، تحتوي على ملف ، التضمين ، TTS ، إلخ ...event ( ViewButton.Event ) قم بتعيين زر ليتم تعطيله أو إزالته عند الضغط عليه | اسم | يكتب | القيمة الافتراضية | تستخدم ل |
|---|---|---|---|
name | str | None | اسم الزر |
skip | ViewButton.Skip | None | قم بتعيين الإجراء وكمية الصفحات لتخطيها عند استخدام custom_id من ViewButton.ID_SKIP . على سبيل المثال ، تعيين الإجراء على "+" والكمية 3. إذا كنت على "الصفحة 1/20" ، فإن الضغط على هذا الزر سيقلبك إلى "صفحة 4/20" |
persist | bool | False | يمنع أزرار الارتباط من تعطيلها/إزالتها عند عرض القائمة أو توقفها حتى تتمكن من البقاء قابلة للنقر |
| ملكية | نوع العودة | معلومات |
|---|---|---|
clicked_by | Set[discord.Member] | الأعضاء الذين نقروا على الزر |
total_clicks | int | مقدار النقرات من الزر |
last_clicked | Optional[datetime.datetime] | الوقت في UTC عندما تم النقر على الزر آخر مرة |
menu | Optional[ViewMenu] | القائمة المرفقة بالزر |
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 (...)))ملاحظة: عندما يتعلق الأمر بالأزرار التي تحتوي على
custom_idمنViewButton.ID_CALLER،ViewButton.ID_SEND_MESSAGE،ViewButton.ID_CUSTOM_EMBED، أو أزرار الارتباط ، يمكنك إضافة أكبر عدد تريده في إجمالي 25 بوتون أو أقل. لجميع معرف الزر الآخر ، يمكن أن تحتوي كل قائمة فقط على قائمة.
يتم استخدام الاختيار عندما ترغب في تصنيف المعلومات في قائمتك. لا يمكن استخدام Selects إلا عند TypeEmbed menu_type في القائمة. يجب أن تضع في اعتبارك أن القيود على عدد من عناصر واجهة مستخدم القائمة (الصفوف) يمكن تطبيقها على كل رسالة.
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])مثال:
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 ()يمكنك استخدام هذا النوع من تحديد متى ترغب في استخدام واجهة المستخدم لتحديد صفحة للذهاب إليها.
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() يمكن استخدام المعلمة page_numbers لـ ViewSelect.GoTo مع 3 أنواع مختلفة
List[int] إذا تم تعيينها على قائمة من الأعداد الصحيحة ، فإن هذه القيم المحددة هي الخيارات الوحيدة المتوفرة عند النقر فوق تحديدpage_numbers=[1, 5, 10]Dict[int, Union[str, discord.Emoji, discord.PartialEmoji]] يمكنك استخدام هذا النوع إذا كنت ترغب في استخدام الرموز التعبيرية في Selectpage_numbers={1 : "?️", 2 : ""}ellipsis يمكنك تعيين عجلات الحطع الحرفي لوجود المكتبة تلقائيًا تعيين جميع أرقام الصفحات إلى كمية الصفحات التي أضفتها إلى القائمة. يمكن أن يكون هذا مفيدًا إذا كان لديك 25 صفحة أو أقلpage_numbers=...ملاحظة : إعداد معلمة
page_numbersعلى القطع (...) لا يعمل إلا على النحو المقصود إذا قمت بإضافة GO إلى تحديد بعد إضافة صفحات إلى القائمة
@ 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]) عند تشغيل القائمة ، يمكنك تحديث الصفحات أو الأزرار في القائمة. باستخدام ViewMenu.update() ، يمكنك استبدال الصفحات والأزرار. باستخدام ViewMenu.refresh_menu_items() يقوم بتحديث الأزرار التي قمت بتغييرها.
@ 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 () إذا لم يتم تحديث الأزرار باستخدام ViewMenu.refresh_menu_items() ، فلن يتم تحديث القائمة عند تغيير زر.
يتم استخدام Method ViewMenu.update(...) عندما تريد استبدال كل أو عدد قليل من الأزرار في القائمة.
menu = ViewMenu (...)
# in a different .command()
await menu . update ( new_pages = [ hello_embed , goodbye_embed ], new_buttons = [ link_button , next_button ])ملاحظة : عند استخدام
ViewMenu.update(...)، ليست هناك حاجة لاستخدامViewMenu.refresh_menu_items()لأنه يتم تحديثها أثناء مكالمة التحديث.
تأتي فئة ViewButton مع أساليب مصنع (أساليب الفصل) التي تُرجع عرض ViewButton مع المعلمات المحددة وفقًا لـ custom_id (باستثناء أزرار الارتباط).
ViewButton.link(label: str, url: str)style : discord.ButtonStyle.linklabel : <label>url : <url>ViewButton.back()style : discord.ButtonStyle.graylabel : "العودة"custom_id : ViewButton.ID_PREVIOUS_PAGEViewButton.next()style : discord.ButtonStyle.graylabel : "التالي"custom_id : ViewButton.ID_NEXT_PAGEViewButton.go_to_first_page()style : discord.ButtonStyle.graylabel : "الصفحة الأولى"custom_id : ViewButton.ID_GO_TO_FIRST_PAGEViewButton.go_to_last_page()style : discord.ButtonStyle.graylabel : "الصفحة الأخيرة"custom_id : ViewButton.ID_GO_TO_LAST_PAGEViewButton.go_to_page()style : discord.ButtonStyle.graylabel : "اختيار الصفحة"custom_id : ViewButton.ID_GO_TO_PAGEViewButton.end_session()discord.ButtonStyle.grayViewButton.ID_END_SESSIONViewButton.all()list ViewButton بالترتيب التالي.go_to_first_page() .back() .next() .go_to_last_page() .go_to_page() .end_session()ViewButton.all_with_emojis()list ViewButton مع معلمات emoji الخاصة بهم تم تعيينها بالفعل بالترتيب التالي.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 () يمكنك تعيين ViewButton ليتم تعطيلها أو إزالتها عند الضغط عليها بمقدار معين من المرات
class ViewButton.Event(event_type: str, value: int)
event_type ( str ) الإجراء الذي يجب اتخاذه. يمكن إما "تعطيل" أو "إزالة"value ( int ) المبلغ المحدد للحدث المحدد. يجب أن يكون> = 1. إذا كانت القيمة <= 0 ، فسيتم ضبطها ضمنيًا على 1مثال:
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 )ملاحظة: غير صالح لأزرار الارتباط. كما أنها ليست مثالية للأزرار مع
custom_idمنViewButton.ID_END_SESSION
مرحلات القائمة هي وظائف تسمى في أي وقت يتم فيه الضغط على زر يكون بصرف النظر عن القائمة. يعتبر امتدادًا لـ ViewButton مع معرف من ViewButton.ID_CALLER . على عكس أزرار المتصل التي لا توفر تفاصيل حول التفاعلات في القائمة ، فإن المرحلات تفعل.
ViewMenu.set_relay(func: Callable[[NamedTuple], None], *, only: Optional[List[ViewButton]]=None)ViewMenu.remove_relay() عند إنشاء وظيفة للتتابع الخاص بك ، يجب أن تحتوي هذه الوظيفة على وسيطة موضعية واحدة. عند الضغط على زر ، يتم تمرير كائن RelayPayload (tuple المسماة) إلى هذه الوظيفة. سمات RelayPayload هي:
member ( discord.Member ) الشخص الذي ضغط على الزرbutton ( ViewButton ) الزر الذي تم الضغط عليهمثال:
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 ) تأتي طريقة set_relay مع المعلمة only . إذا None تكن هذه المعلمة ، فسيتم نقل جميع الأزرار التي يتم الضغط عليها (باستثناء أزرار الارتباط لأنها لا ترسل أحداث التفاعل). يمكنك توفير list من الأزرار لتلك المعلمة بحيث يتم نقل الزر فقط من تلك الأزرار المحددة.
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) عند بدء القائمة ، لديك خيار إرسال القائمة إلى قناة معينة. المعلمة send_to هي القناة التي ترغب في إرسال القائمة إلى. يمكنك تعيين send_to كاسم القناة ( str ) أو معرف القناة ( int ) أو كائن القناة ( discord.TextChannel / discord.Thread ). مثال:
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 ()ملاحظة:
send_toغير صالح إذا تم بدء قائمة في DM's
يتوفر خيار واحد فقط عند إيقاف القائمة. إذا كان لديك معلمات متعددة True ، فسيتم تنفيذ واحد فقط
delete_menu_message > disable_buttonsdisable_buttons > remove_buttons فيما يلي تطبيق أساسي لـ ViewMenu يمكنك نسخه ولصقه لتقديم عرض سريع.
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 ())