mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2024-11-29 12:53:44 +03:00
b6b4ea669d
Since it was easy to cause MRO inconsistencies, and it's not really needed now that self is type hinted as the client.
96 lines
3.2 KiB
Python
96 lines
3.2 KiB
Python
import typing
|
|
|
|
from .. import utils, hints
|
|
from ..tl import types, custom
|
|
|
|
|
|
class ButtonMethods:
|
|
@staticmethod
|
|
def build_reply_markup(
|
|
buttons: 'typing.Optional[hints.MarkupLike]',
|
|
inline_only: bool = False) -> 'typing.Optional[types.TypeReplyMarkup]':
|
|
"""
|
|
Builds a :tl:`ReplyInlineMarkup` or :tl:`ReplyKeyboardMarkup` for
|
|
the given buttons.
|
|
|
|
Does nothing if either no buttons are provided or the provided
|
|
argument is already a reply markup.
|
|
|
|
You should consider using this method if you are going to reuse
|
|
the markup very often. Otherwise, it is not necessary.
|
|
|
|
This method is **not** asynchronous (don't use ``await`` on it).
|
|
|
|
Arguments
|
|
buttons (`hints.MarkupLike`):
|
|
The button, list of buttons, array of buttons or markup
|
|
to convert into a markup.
|
|
|
|
inline_only (`bool`, optional):
|
|
Whether the buttons **must** be inline buttons only or not.
|
|
|
|
Example
|
|
.. code-block:: python
|
|
|
|
from telethon import Button
|
|
|
|
markup = client.build_reply_markup(Button.inline('hi'))
|
|
client.send_message('click me', buttons=markup)
|
|
"""
|
|
if buttons is None:
|
|
return None
|
|
|
|
try:
|
|
if buttons.SUBCLASS_OF_ID == 0xe2e10ef2:
|
|
return buttons # crc32(b'ReplyMarkup'):
|
|
except AttributeError:
|
|
pass
|
|
|
|
if not utils.is_list_like(buttons):
|
|
buttons = [[buttons]]
|
|
elif not utils.is_list_like(buttons[0]):
|
|
buttons = [buttons]
|
|
|
|
is_inline = False
|
|
is_normal = False
|
|
resize = None
|
|
single_use = None
|
|
selective = None
|
|
|
|
rows = []
|
|
for row in buttons:
|
|
current = []
|
|
for button in row:
|
|
if isinstance(button, custom.Button):
|
|
if button.resize is not None:
|
|
resize = button.resize
|
|
if button.single_use is not None:
|
|
single_use = button.single_use
|
|
if button.selective is not None:
|
|
selective = button.selective
|
|
|
|
button = button.button
|
|
elif isinstance(button, custom.MessageButton):
|
|
button = button.button
|
|
|
|
inline = custom.Button._is_inline(button)
|
|
is_inline |= inline
|
|
is_normal |= not inline
|
|
|
|
if button.SUBCLASS_OF_ID == 0xbad74a3:
|
|
# 0xbad74a3 == crc32(b'KeyboardButton')
|
|
current.append(button)
|
|
|
|
if current:
|
|
rows.append(types.KeyboardButtonRow(current))
|
|
|
|
if inline_only and is_normal:
|
|
raise ValueError('You cannot use non-inline buttons here')
|
|
elif is_inline == is_normal and is_normal:
|
|
raise ValueError('You cannot mix inline with normal buttons')
|
|
elif is_inline:
|
|
return types.ReplyInlineMarkup(rows)
|
|
# elif is_normal:
|
|
return types.ReplyKeyboardMarkup(
|
|
rows, resize=resize, single_use=single_use, selective=selective)
|