Sie können die neueste PYPI -Version der Bibliothek installieren, indem Sie:
$ pip install reactionmenu
Oder die Entwicklungsversion:
$ pip install git+https://github.com/Defxult/reactionmenu
Mindestabsichten erforderlich
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)
Ein ReactionMenu ist ein Menü, das Emojis verwendet, die entweder benutzerdefinierte Gilden -Emojis oder ein normales Emoji sind, um den Paginationsprozess zu steuern. Wenn Sie keine der ausgefallenen Funktionen suchen und nur etwas Einfaches möchten, ist dies derjenige, der verwendet wird.
from reactionmenu import ReactionMenu , ReactionButtonDiese Bibliothek verfügt über verschiedene Methoden und Optionen, um ein Discord -Reaktionsmenü einfach zu gestalten. Sobald Sie die richtigen Klassen importiert haben, werden Sie den Konstruktor so initialisieren wie so:
menu = ReactionMenu ( method , menu_type = ReactionMenu . TypeEmbed )method ( Union[discord.ext.commands.Context, discord.Interaction] ) Ein Kontext oder Interaktionsobjektmenu_type ( MenuType ) Die Konfiguration des MenüsReactionMenu.TypeEmbed .ReactionMenu.TypeEmbedDynamicReactionMenu.TypeText| Name | Typ | Standardwert | Verwendet für | Info |
|---|---|---|---|---|
wrap_in_codeblock | str | None | ReactionMenu.TypeEmbedDynamic | Der Discord CodeBlock Language Identifier zum Einwickeln Ihrer Daten. Beispiel: ReactionMenu(ctx, ..., wrap_in_codeblock='py') |
custom_embed | discord.Embed | None | ReactionMenu.TypeEmbedDynamic | Einbettete Objekt zum Hinzufügen von Daten mit ReactionMenu.add_row() . Für Stylingzwecke verwendet |
delete_on_timeout | bool | False | All menu types | Löschen Sie das Menü, wenn es ausfällt |
clear_reactions_after | bool | True | All menu types | Löschen Sie alle Reaktionen nach dem Ausgang des Menüs |
navigation_speed | str | ReactionMenu.NORMAL | All menu types | Setzt, wenn der Benutzer warten muss, bis die Reaktion vom Bot entfernt wird, bevor der Bot die Seite "drehen". Setzen Sie die Geschwindigkeit auf ReactionMenu.FAST so, dass kein Warten erforderlich ist (Reaktionen werden bei jedem Druck nicht entfernt) und können schneller navigieren |
only_roles | List[discord.Role] | None | All menu types | Wenn festgelegt, dürfen nur Mitglieder mit einer der angegebenen Rollen das Menü steuern. Der Menübesitzer kann das Menü jederzeit steuern |
timeout | Union[int, float, None] | 60.0 | All menu types | Der Timer für das Menü ausfällt. Kann None aus dem Zeitpunkt sein |
show_page_director | bool | True | All menu types | Am unteren Rand jeder Einbettungsseite angezeigt. "Seite 1/20" |
name | str | None | All menu types | Ein Name, den Sie für das Menü festlegen können |
style | str | "Page $/&" | All menu types | Ein benutzerdefinierter Seitendirektorstil, den Sie auswählen können. "$" repräsentiert die aktuelle Seite "&" repräsentiert die Gesamtmenge der Seiten. Beispiel: ReactionMenu(ctx, ..., style='On $ out of &') |
all_can_click | bool | False | All menu types | Sätze, wenn jeder steuern darf, wenn Seiten "gedreht" werden, wenn Schaltflächen klicken |
delete_interactions | bool | True | All menu types | Löschen Sie die Eingabeaufforderungnachricht durch den Bot- und Antwortnachricht durch den Benutzer, wenn Sie ReactionButton.Type.GO_TO_PAGE werden |
rows_requested | int | None | ReactionMenu.TypeEmbedDynamic | Die Anzahl der Informationen pro ReactionMenu.add_row() |
remove_extra_emojis | bool | False | All menu types | Wenn True , werden alle Emojis (Reaktionen) zur Menümeldung hinzugefügt, die ursprünglich nicht zum Menü hinzugefügt wurde |
Abhängig vom menu_type können Seiten entweder ein str , discord.Embed oder eine Kombination aus content und files sein (Beispiel unten)
menu_type ReactionMenu.TypeEmbed ist.menu_type ReactionMenu.TypeText (nur Textmenü) oder ReactionMenu.TypeEmbedDynamic (nur einbettete Menü), verwenden Sie Zeichenfolgen.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!' ) Ein TypeText -Menü ist ein textbasiertes Paginationsmenü. In den Paginationsprozess sind keine Einbettungen beteiligt, nur ein einfacher Text wird verwendet.
Mit v3.1.0+ können Sie mehr als nur eine Einbettung oder einen Text paginieren. Sie können Text, Einbettungen sowie Dateien kombinieren. Abhängig vom menu_type kann die Kombination eingeschränkt werden. Hier ist ein Beispiel für ein Menü mit einem menu_type vom gestapelten 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 () Da das menu_type TypeEmbed ist, muss es auf jeder Seite immer ein Einbetten geben. Wenn der menu_type TypeText war, sind Einbettungen nicht zulässig und Sie sind nur den Parameter files beschränkt.
Ein dynamisches Menü wird verwendet, wenn Sie nicht wissen, wie viele Informationen auf das Menü angewendet werden. Wenn Sie beispielsweise Informationen aus einer Datenbank anfordern, können sich diese Informationen immer ändern. Sie befragen etwas und Sie erhalten möglicherweise 1.500 Ergebnisse zurück, und das nächste vielleicht nur 800. Ein dynamisches Menü, alle diese Informationen für Sie zusammen und fügt es einer Einbettungsseite nach Datenzeilen hinzu. ReactionMenu.add_row() wird am besten in einer Art Iterable verwendet, in dem alles durchschleifen kann, aber nur die gewünschte Datenmenge zur Menüseite hinzufügen.
HINWEIS: In einem dynamischen Menü werden alle hinzugefügten Daten in den Beschreibung eines Einbettbeschreibungsabschnitts platziert. Wenn Sie ein
custom_embedverwenden, wird der gesamte Text in der Beschreibung mit den von Ihnen hinzugefügten Daten überschrieben
ReactionMenu.add_row(data: str)ReactionMenu.clear_all_row_data()ReactionMenu.set_main_pages(*embeds: Embed)ReactionMenu.set_last_pages(*embeds: Embed)rows_requested - Die Anzahl der Zeilen, die Sie auf jeder Einbettungsseite möchten, bevor Sie eine neue Seite erstellenReactionMenu(..., rows_requested=5)custom_embed - eine Einbettung, die Sie als Einbettseiten erstellt haben. Wird für Ihre Menüästhetik verwendetReactionMenu(..., custom_embed=red_embed)wrap_in_codeblock - Die Sprachkennung beim Wickeln Ihrer Daten in einen Discord -CodeBlock.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 ) Sie können alle Daten entfernen, die Sie zu einem Menü hinzugefügt haben, indem Sie menu.clear_all_row_data()
Bei Verwendung eines dynamischen Menüs stammen die einzigen Einbettungsseiten, die Sie sehen, aus den von Ihnen hinzugefügten Daten. Wenn Sie jedoch mehr Seiten als nur die Daten anzeigen möchten, können Sie Methoden ReactionMenu.set_main_pages() und ReactionMenu.set_last_pages() verwenden. Wenn Sie die Hauptseite (en) festlegen, sind die von Ihnen festgelegten Einbettungen die ersten Einbettungen, die beim Starten des Menüs angezeigt werden. Das Einstellen der letzten Seite sind die letzten gezeigten Einbettungen
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 orderTasten/Tastentypen werden verwendet, wenn Sie dem Menü, das eine bestimmte Funktion erfüllt, eine Reaktion hinzufügen möchten. Tasten und Tastentypen arbeiten zusammen, um die gewünschte Aktion zu erreichen.
class reactionmenu.ReactionButton(*, emoji: str, linked_to: ButtonType, **kwargs)
emoji ( str ) das Emoji, das Sie als Reaktion verwenden möchtenlinked_to ( ReactionButton.Type ) Wenn die Reaktion gedrückt wird, bestimmt dies, was sie tun wird| Name | Typ | Standardwert | Verwendet für |
|---|---|---|---|
embed | discord.Embed | None | Wenn die Reaktion gedrückt wird, gehen Sie zum angegebenen Einbett |
name | str | None | Der Name der Schaltfläche |
details | Info unten | None | Weist die Funktion und ihre Argumente zu, die aufgerufen werden müssen, wenn ein ReactionButton mit ReactionButton.Type.CALLER gedrückt wird |
event | ReactionButton.Event | None | Stellen Sie fest, wann eine Taste entfernt werden sollte, je nachdem, wie oft er gedrückt wurde |
skip | ReactionButton.Skip | None | Stellen Sie die Aktion und die Menge der Seiten ein, um zu überspringen, wenn Sie einen linked_to von ReactionButton.Type.SKIP verwenden. Wenn Sie beispielsweise diesen Schaltflächentyp verwenden, wird die Aktion auf "+" und den Betrag eingestellt. Wenn Sie sich auf "Seite 1/20" befinden, erhalten Sie auf diese Taste zu "Seite 4/20". |
| Eigentum | Rückgabetyp | Info |
|---|---|---|
clicked_by | Set[discord.Member] | Die Mitglieder, die auf die Schaltfläche geklickt haben |
total_clicks | int | Anzahl der Klicks aus der Schaltfläche |
last_clicked | Optional[datetime.datetime] | Die Zeit in UTC für den letzten Klick der Schaltfläche |
menu | Optional[ReactionMenu] | Das Menü, an das die Schaltfläche angehängt ist |
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)| Typ | Info |
|---|---|
ReactionButton.Type.NEXT_PAGE | Gehen Sie zur nächsten Seite in der Menüsitzung |
ReactionButton.Type.PREVIOUS_PAGE | Gehen Sie in der Menüsitzung zur vorherigen Seite |
ReactionButton.Type.GO_TO_FIRST_PAGE | Gehen Sie zur ersten Seite in der Menüsitzung |
ReactionButton.Type.GO_TO_LAST_PAGE | Gehen Sie zur letzten Seite in der Menüsitzung |
ReactionButton.Type.GO_TO_PAGE | Fordert Sie auf, die Seite einzugeben, auf die Sie gehen möchten |
ReactionButton.Type.END_SESSION | Stoppt die Sitzung und löscht die Menünachricht |
ReactionButton.Type.CUSTOM_EMBED | Getrennt von den Navigationsknöpfen verwendet. Gehen Sie nach dem Druck zum angegebenen Einbett |
ReactionButton.Type.CALLER | Wird verwendet, um die aufgerufene Funktion anzugeben, und es sind Argumente, wenn die Taste gedrückt wird |
ReactionButton.Type.SKIP | Wird verwendet, um mehrere Seiten in einer einzelnen Taste zu paginieren. Drücken Sie |
Sie können dem Menü mit einem ReactionButton Schaltflächen (Reaktionen) hinzufügen. Im Folgenden finden Sie Beispiele, wie Sie die einzelnen ButtonType verwenden.
HINWEIS: Reaktionsbuttons mit
ReactionButton.Type.CALLERsind etwas anders, sodass ein spezieller Abschnitt erklärt wird
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 )
... Entfernen Sie alle Tasten mit menu.remove_all_buttons() . Sie können auch eine einzelne Taste mit ihrem Namen entfernen, wenn Sie sie festgelegt haben, oder das Schaltflächenobjekt selbst mit menu.remove_button()
ReactionButton.Type.CALLER -Schaltflächen werden verwendet, um Ihre eigenen Funktionen in das Menü zu implementieren. Vielleicht möchten Sie eine Schaltfläche hinzufügen, die einen Textkanal erstellt, eine Nachricht sendet oder einer Datenbank etwas hinzufügt, was auch immer sie sein mag. Verwenden Sie die Klassenmethode unten, um mit ReactionButton.Type.CALLER zu arbeiten.
ReactionButton.set_caller_details(func: Callable[..., None], *args, **kwargs) Diese Klassenmethode wird verwendet, um eine Funktion einzurichten, und ihre Argumente werden später aufgerufen, wenn die Taste gedrückt wird. Der ReactionButton -Konstruktor hat die KWARG details , und das verwenden Sie mit .set_caller_details() um die erforderlichen Werte zuzuweisen. ReactionButton.Type.CALLER Beispiele finden Sie weiter unten
@ 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' ))Hinweis: Die Funktion, in der Sie übergeben, sollte nichts zurückgeben. Aufrufen von Funktionen mit
ReactionButton.Type.CALLERspeichert oder verarbeitet nichts, das von dieser Funktion zurückgegeben wird
Die ReactionButton -Klasse verfügt über eine festgelegte Fabrikmethoden (Klassenmethoden), die eine ReactionButton mit Parametern zurückgibt, die gemäß ihrem linked_to festgelegt sind.
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 von ReactionButton in der folgenden Reihenfolge zurück.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>)Wenn Sie möchten, können Sie die Menge der Reaktionsmenüs begrenzen, die gleichzeitig per "Gilde", "Mitglied" oder "Kanal" aktiv sein können.
ReactionMenu.set_sessions_limit(limit: int, per='guild', message='Too many active menus. Wait for other menus to be finished.')ReactionMenu.remove_limit()Beispiel:
@ bot . command ()
async def limit ( ctx ):
ReactionMenu . set_sessions_limit ( 3 , per = 'member' , message = 'Sessions are limited to 3 per member' )Mit dem obigen Beispiel können nur 3 Menüs für jedes Mitglied gleichzeitig aktiv sein. Wenn sie versuchen, mehr zu erstellen, bevor die anderen Menüs fertig sind, erhalten sie eine Fehlermeldung mit der Aufschrift "Die Sitzungen sind auf 3 pro Mitglied begrenzt".
Sie können einen ReactionButton einstellen, der entfernt werden soll, wenn es einige Male drückt,
class ReactionButton.Event(event_type: str, value: int)
event_type ( str ) Die zu ergreifen. Die einzige verfügbare Option ist "entfernen"value ( int ) der für das angegebene Ereignis festgelegte Betrag. Muss> = 1 sein. Wenn der Wert <= 0 ist, ist er implizit auf 1 eingestelltBeispiel:
menu = ReactionMenu ( ctx , ...)
# remove a button after 10 clicks
button = ReactionButton (..., event = ReactionButton . Event ( 'remove' , 10 ))
menu . add_button ( button )Hinweis: Nicht ideal für Schaltflächen mit einem
linked_tovonReactionButton.Type.END_SESSION
Menüstrelais sind Funktionen, die auf jeden Zeitpunkt, an dem eine Taste eines Menüs getrennt ist, aufgerufen werden. Es wird als Erweiterung eines ReactionButton mit einem linked_to von ReactionButton.Type.CALLER angesehen. Im Gegensatz zu Caller -Schaltflächen, die keine Details zu den Interaktionen im Menü enthielten, tun Relais.
ReactionMenu.set_relay(func: Callable[[NamedTuple], None], *, only: Optional[List[ReactionButton]]=None)ReactionMenu.remove_relay() Beim Erstellen einer Funktion für Ihr Relais muss diese Funktion ein einzelnes Positionsargument enthalten. Wenn eine Taste gedrückt wird, wird ein RelayPayload -Objekt (ein benanntes Tupel) an diese Funktion übergeben. Die Attribute von RelayPayload sind:
member ( discord.Member ) Die Person, die die Taste gedrückt hatbutton ( ReactionButton ) Die Taste, die gedrückt wurdeBeispiel:
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 ) Die set_relay -Methode wird mit dem only Parameter geliefert. Wenn dieser Parameter None ist, werden alle gedrückten Tasten weitergeleitet. Sie können eine list von Schaltflächen für diesen Parameter bereitstellen, sodass nur die Taste der angegebenen Schaltflächen weitergegeben werden.
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) Wenn Sie das Menü starten, haben Sie die Möglichkeit, das Menü an einen bestimmten Kanal zu senden. Parameter send_to ist der Kanal, an den Sie das Menü senden möchten. Sie können send_to als Kanalname ( str ), Kanal -ID ( int ) oder Kanalobjekt ( discord.TextChannel / discord.Thread ) festlegen. Beispiel:
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 ()Hinweis:
send_toist nicht gültig, wenn ein Menü in DMs gestartet wurde
Hier ist eine grundlegende Implementierung von ReactionMenu , die Sie für eine kurze Demonstration kopieren und einfügen können.
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)
Ein ViewMenu ist ein Menü, das die Funktion "Discords" verwendet. Mit Tasten können Sie sie aktivieren und deaktivieren, eine bestimmte Farbe für sie mit Emojis einstellen, Schaltflächen haben, die versteckte Nachrichten senden, und Hyperlinks hinzufügen. Diese Bibliothek bietet ein breiteres Spektrum an Funktionen, wie z. B. wer auf die Taste gedrückt hat, wie oft sie gedrückt wurde und mehr. Es verwendet Ansichten ( discord.ui.View ), um die Schaltflächenfunktionalität zu implementieren, aber einige seiner eigenen Methoden, um ein Schaltfläche Pagination -Menü einfach zu gestalten.
from reactionmenu import ViewMenu , ViewButtonmethod ( Union[discord.ext.commands.Context, discord.Interaction] ) Ein Kontext oder Interaktionsobjektmenu_type ( MenuType ) Die Konfiguration des MenüsViewMenu.TypeEmbed , ein normales Einbettungs -PaginierungsmenüViewMenu.TypeEmbedDynamic , ein Einbett -Paginierungsmenü mit dynamischen DatenViewMenu.TypeText , ein Menü "Nur für Text| Name | Typ | Standardwert | Verwendet für | Info |
|---|---|---|---|---|
wrap_in_codeblock | str | None | ViewMenu.TypeEmbedDynamic | Der Discord -CodeBlock -Sprachbezeichner zum Einwickeln Ihrer Daten. Beispiel: ViewMenu(ctx, ..., wrap_in_codeblock='py') |
custom_embed | discord.Embed | None | ViewMenu.TypeEmbedDynamic | Einbettete Objekt zum Hinzufügen von Daten mit ViewMenu.add_row() . Für Stylingzwecke verwendet |
delete_on_timeout | bool | False | All menu types | Löschen Sie das Menü, wenn es ausfällt |
disable_items_on_timeout | bool | True | All menu types | Deaktivieren Sie die Elemente im Menü, wenn das Menü ausfällt |
remove_items_on_timeout | bool | False | All menu types | Entfernen Sie die Elemente im Menü, wenn das Menü ausfällt |
only_roles | List[discord.Role] | None | All menu types | Wenn festgelegt, dürfen nur Mitglieder mit einer der angegebenen Rollen das Menü steuern. Der Menübesitzer kann das Menü jederzeit steuern |
timeout | Union[int, float, None] | 60.0 | All menu types | Der Timer für das Menü ausfällt. Kann None aus dem Zeitpunkt sein |
show_page_director | bool | True | All menu types | Am unteren Rand jeder Einbettungsseite angezeigt. "Seite 1/20" |
name | str | None | All menu types | Ein Name, den Sie für das Menü festlegen können |
style | str | "Page $/&" | All menu types | Ein benutzerdefinierter Seitendirektorstil, den Sie auswählen können. "$" repräsentiert die aktuelle Seite "&" repräsentiert die Gesamtmenge der Seiten. Beispiel: ViewMenu(ctx, ..., style='On $ out of &') |
all_can_click | bool | False | All menu types | Sätze, wenn jeder steuern darf, wenn Seiten "gedreht" werden, wenn Schaltflächen klicken |
delete_interactions | bool | True | All menu types | Löschen Sie die Eingabeaufforderungnachricht durch den Bot- und Antwortnachricht des Benutzers, wenn Sie ViewButton.ID_GO_TO_PAGE werden |
rows_requested | int | None | ViewMenu.TypeEmbedDynamic | Die Anzahl der Informationen pro ViewMenu.add_row() die Sie auf jede Einbettungsseite angewendet würden |
Abhängig vom menu_type können Seiten entweder ein str , discord.Embed oder eine Kombination aus content oder files sein (Beispiel unten)
menu_type ViewMenu.TypeEmbed ist, verwenden Sie Einbettungenmenu_type ViewMenu.TypeText (nur Textmenü) oder ViewMenu.TypeEmbedDynamic (nur einbetten nur Menü), verwenden Sie Zeichenfolgen.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!' ) Ein TypeText -Menü ist ein textbasiertes Paginationsmenü. In den Paginationsprozess sind keine Einbettungen beteiligt, nur ein einfacher Text wird verwendet.
Mit v3.1.0+ können Sie mehr als nur eine Einbettung oder einen Text paginieren. Sie können Text, Einbettungen sowie Dateien kombinieren. Abhängig vom menu_type kann die Kombination eingeschränkt werden. Hier ist ein Beispiel für ein Menü mit einem menu_type vom gestapelten 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 () Da das menu_type TypeEmbed ist, muss es auf jeder Seite immer ein Einbetten geben. Wenn der menu_type TypeText war, sind Einbettungen nicht zulässig und Sie sind nur den Parameter files beschränkt.
Ein dynamisches Menü wird verwendet, wenn Sie nicht wissen, wie viele Informationen auf das Menü angewendet werden. Wenn Sie beispielsweise Informationen aus einer Datenbank anfordern, können sich diese Informationen immer ändern. Sie befragen etwas und Sie erhalten möglicherweise 1.500 Ergebnisse zurück, und das nächste vielleicht nur 800. Ein dynamisches Menü, alle diese Informationen für Sie zusammen und fügt es einer Einbettungsseite nach Datenzeilen hinzu. ViewMenu.add_row() wird am besten in einer Art Iterable verwendet, in dem alles durchschleifen kann, aber nur die Datenmenge, die Sie möchten, zur Menüseite hinzugefügt werden.
HINWEIS: In einem dynamischen Menü werden alle hinzugefügten Daten in den Beschreibung eines Einbettbeschreibungsabschnitts platziert. Wenn Sie ein
custom_embedverwenden, wird der gesamte Text in der Beschreibung mit den von Ihnen hinzugefügten Daten überschrieben
ViewMenu.add_row(data: str)ViewMenu.clear_all_row_data()ViewMenu.set_main_pages(*embeds: Embed)ViewMenu.set_last_pages(*embeds: Embed)rows_requested - Die Anzahl der Zeilen, die Sie auf jeder Einbettungsseite möchten, bevor Sie eine neue Seite erstellenViewMenu(..., rows_requested=5)custom_embed - eine Einbettung, die Sie als Einbettseiten erstellt haben. Wird für Ihre Menüästhetik verwendetViewMenu(..., custom_embed=red_embed)wrap_in_codeblock - Die Sprachkennung beim Wickeln Ihrer Daten in einen Discord -CodeBlock.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 ) Sie können alle Daten entfernen, die Sie zu einem Menü hinzugefügt haben, indem Sie menu.clear_all_row_data()
Bei Verwendung eines dynamischen Menüs stammen die einzigen Einbettungsseiten, die Sie sehen, aus den von Ihnen hinzugefügten Daten. Wenn Sie jedoch mehr Seiten als nur die Daten anzeigen möchten, können Sie Methoden ViewMenu.set_main_pages() und ViewMenu.set_last_pages() verwenden. Wenn Sie die Hauptseite (en) festlegen, sind die von Ihnen festgelegten Einbettungen die ersten Einbettungen, die beim Starten des Menüs angezeigt werden. Das Einstellen der letzten Seite sind die letzten gezeigten Einbettungen
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 orderTasten sind das, was Sie verwenden, um mit dem Menü zu interagieren. Im Gegensatz zu Reaktionen sehen sie sauberer aus, bieten weniger Probleme mit der Ratengrenze und bieten mehr Interaktionen an. Aktivieren und deaktivieren Sie Schaltflächen, verwenden Sie Markdown -Hyperlinks in den Nachrichten und senden Sie sogar versteckte Nachrichten.
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)
Ein ViewButton ist eine Klasse, die den Discord -Taste darstellt. Es ist eine Unterklasse von discord.ui.Button .
Im Folgenden sind die Regeln von Discord für Tasten festgelegt:
custom_id haben und keine url haben könnenurl haben und können keine custom_id habenstyle ( discord.ButtonStyle ) Der Button -Stillabel ( str ) den Text auf der Schaltflächecustom_id ( str ) Eine ID, um zu bestimmen, welche Aktion diese Taste ergreifen sollte. Verfügbare IDs: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, der für den Knopf verwendet wirdViewButton(..., emoji='?')ViewButton(..., emoji='<:miscTwitter:705423192818450453>')ViewButton(..., emoji='U000027a1')ViewButton(..., emoji='N{winking face}')url ( str ) URL für einen Knopf mit Stil discord.ButtonStyle.linkdisabled ( bool ) Wenn die Schaltfläche deaktiviert werden solltefollowup ( ViewButton.Followup ) Die nach dem Drücken der Taste gesendete Nachricht. Nur für Schaltflächen mit einer custom_id von ViewButton.ID_CALLER oder ViewButton.ID_SEND_MESSAGE verfügbar. ViewButton.Followup ist eine Klasse, die Parameter ähnelt wie discord.abc.Messageable.send() , und wird verwendet, um zu steuern, ob eine Nachricht kurzlebig ist, eine Datei, einbettet, TTS usw.event ( ViewButton.Event ) Stellen Sie eine Taste fest, die deaktiviert oder entfernt werden kann, wenn sie einige Male gedrückt wurde | Name | Typ | Standardwert | Verwendet für |
|---|---|---|---|
name | str | None | Der Name der Schaltfläche |
skip | ViewButton.Skip | None | Setzen Sie die Aktion und die Menge der Seiten zum Überspringen, wenn Sie eine custom_id von ViewButton.ID_SKIP verwenden. Wenn Sie beispielsweise die Aktion auf "+" und den Betrag einstellen. |
persist | bool | False | Verhindert, dass Linkschaltflächen deaktiviert/entfernt werden, wenn das Menü ausfällt oder gestoppt wird, damit sie klickbar bleiben können |
| Eigentum | Rückgabetyp | Info |
|---|---|---|
clicked_by | Set[discord.Member] | Die Mitglieder, die auf die Schaltfläche geklickt haben |
total_clicks | int | Anzahl der Klicks aus der Schaltfläche |
last_clicked | Optional[datetime.datetime] | Die Zeit in UTC für den letzten Klick der Schaltfläche |
menu | Optional[ViewMenu] | Das Menü, an das die Schaltfläche angehängt ist |
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 (...)))HINWEIS: Wenn es um Schaltflächen mit einem
custom_idvonViewButton.ID_CALLER,ViewButton.ID_SEND_MESSAGE,ViewButton.ID_CUSTOM_EMBEDoder Link -Schaltflächen geht, können Sie so viele hinzufügen, wie Sie möchten, so lange wie insgesamt 25 Schaltflächen oder weniger. Für alle anderen Schaltflächen -IDs kann jedes Menü nur eines haben.
Ausgewählte werden verwendet, wenn Sie Informationen in Ihrem Menü kategorisieren möchten. Auswahl kann nur verwendet werden, wenn das menu_type des Menüs TypeEmbed ist. Sie sollten bedenken, dass die Einschränkungen der Anzahl der Menü -UI -Elemente (Zeilen) auf jede Nachricht dispondiert.
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])Beispiel:
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 ()Sie können diese Art von Auswahl verwenden, wenn Sie mit der Benutzeroberfläche eine Seite auswählen möchten.
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() Der Parameter page_numbers für ViewSelect.GoTo kann mit 3 verschiedenen Typen verwendet werden
List[int] Wenn auf eine Liste von Ganzzahlen festgelegt wird, sind diese angegebenen Werte die einzigen Optionen, die verfügbar sind, wenn das Auswählen klicktpage_numbers=[1, 5, 10]Dict[int, Union[str, discord.Emoji, discord.PartialEmoji]] Sie können diesen Typ verwenden, wenn Sie Emojis in Ihrem Auswahl verwenden möchtenpage_numbers={1 : "?️", 2 : ""}ellipsis Sie können eine buchstäbliche Ellipsis festlegen, damit die Bibliothek alle Seitenzahlen automatisch der Menge der Seiten zuordnet, die Sie dem Menü hinzugefügt haben. Dies kann nützlich sein, wenn Sie 25 Seiten oder weniger habenpage_numbers=...Hinweis : Das Einstellen des Parameters "
page_numbersin eine Ellipsis (...) funktioniert nur wie beabsichtigt, wenn Sie die Auswahl hinzugefügt haben, nachdem Sie Seiten zum Menü hinzugefügt haben
@ 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]) Wenn das Menü ausgeführt wird, können Sie die Seiten oder Schaltflächen im Menü aktualisieren. Mit ViewMenu.update() können Sie die Seiten und Tasten ersetzen. Verwenden Sie ViewMenu.refresh_menu_items() aktualisiert die von Ihnen geänderten Schaltflächen.
@ 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 () Wenn die Schaltflächen nicht mit ViewMenu.refresh_menu_items() aktualisiert werden, wird das Menü beim Ändern einer Schaltfläche nicht aktualisiert.
Method ViewMenu.update(...) wird verwendet, wenn Sie alle oder einige der Schaltflächen im Menü ersetzen möchten.
menu = ViewMenu (...)
# in a different .command()
await menu . update ( new_pages = [ hello_embed , goodbye_embed ], new_buttons = [ link_button , next_button ])Hinweis : Bei Verwendung
ViewMenu.update(...)müssen Sie keineViewMenu.refresh_menu_items()verwenden, da sie während des Update -Anrufs aktualisiert werden.
Die ViewButton -Klasse verfügt über eine festgelegte Fabrikmethoden (Klassenmethoden), die einen ViewButton mit Parametern zurückgibt, die gemäß ihrer custom_id festgelegt sind (ohne Linkschaltflächen).
ViewButton.link(label: str, url: str)style : discord.ButtonStyle.linklabel : <label>url : <url>ViewButton.back()style : discord.ButtonStyle.graylabel : "zurück"custom_id : ViewButton.ID_PREVIOUS_PAGEViewButton.next()style : discord.ButtonStyle.graylabel : "Weiter"custom_id : ViewButton.ID_NEXT_PAGEViewButton.go_to_first_page()style : discord.ButtonStyle.graylabel : "Erste Seite"custom_id : ViewButton.ID_GO_TO_FIRST_PAGEViewButton.go_to_last_page()style : discord.ButtonStyle.graylabel : "Letzte Seite"custom_id : ViewButton.ID_GO_TO_LAST_PAGEViewButton.go_to_page()style : discord.ButtonStyle.graylabel : "Seitenauswahl"custom_id : ViewButton.ID_GO_TO_PAGEViewButton.end_session()discord.ButtonStyle.grayViewButton.ID_END_SESSIONViewButton.all()list von ViewButton zurück.go_to_first_page() .back() .next() .go_to_last_page() .go_to_page() .end_session()ViewButton.all_with_emojis()list von ViewButton zurück, wobei ihre emoji -Parameter bereits in der folgenden Reihenfolge festgelegt wurden.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 () Sie können einen ViewButton festlegen, der deaktiviert oder entfernt werden kann, wenn er einige Male drücken wurde
class ViewButton.Event(event_type: str, value: int)
event_type ( str ) Die zu ergreifen. Kann entweder "deaktivieren" oder "entfernen" werdenvalue ( int ) der für das angegebene Ereignis festgelegte Betrag. Muss> = 1 sein. Wenn der Wert <= 0 ist, ist er implizit auf 1 eingestelltBeispiel:
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 )Hinweis: Nicht gültig für Linkschaltflächen. Auch nicht ideal für Schaltflächen mit
custom_idvonViewButton.ID_END_SESSION
Menüstrelais sind Funktionen, die auf jeden Zeitpunkt, an dem eine Taste eines Menüs getrennt ist, aufgerufen werden. Es wird als Erweiterung eines ViewButton mit einer ID von ViewButton.ID_CALLER angesehen. Im Gegensatz zu Caller -Schaltflächen, die keine Details zu den Interaktionen im Menü enthielten, tun Relais.
ViewMenu.set_relay(func: Callable[[NamedTuple], None], *, only: Optional[List[ViewButton]]=None)ViewMenu.remove_relay() Beim Erstellen einer Funktion für Ihr Relais muss diese Funktion ein einzelnes Positionsargument enthalten. Wenn eine Taste gedrückt wird, wird ein RelayPayload -Objekt (ein benanntes Tupel) an diese Funktion übergeben. Die Attribute von RelayPayload sind:
member ( discord.Member ) Die Person, die die Taste gedrückt hatbutton ( ViewButton ) Die Taste, die gedrückt wurdeBeispiel:
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 ) Die set_relay -Methode wird mit dem only Parameter geliefert. Wenn dieser Parameter None ist, werden alle gedrückten Tasten weitergeleitet (außer Link -Schaltflächen, da sie keine Interaktionsereignisse senden). Sie können eine list von Schaltflächen für diesen Parameter bereitstellen, sodass nur die Taste der angegebenen Schaltflächen weitergegeben werden.
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) Wenn Sie das Menü starten, haben Sie die Möglichkeit, das Menü an einen bestimmten Kanal zu senden. Parameter send_to ist der Kanal, an den Sie das Menü senden möchten. Sie können send_to als Kanalname ( str ), Kanal -ID ( int ) oder Kanalobjekt ( discord.TextChannel / discord.Thread ) festlegen. Beispiel:
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 ()Hinweis:
send_toist nicht gültig, wenn ein Menü in DMs gestartet wurde
Wenn Sie das Menü stoppen, ist nur eine Option verfügbar. Wenn Sie mehrere Parameter als True haben, wird nur einer ausgeführt
delete_menu_message > disable_buttonsdisable_buttons > remove_buttons Hier ist eine grundlegende Implementierung von ViewMenu , die Sie für eine kurze Demonstration kopieren und einfügen können.
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 ())