mirror of
https://github.com/TeamPGM/pyrogram.git
synced 2024-11-30 17:43:32 +00:00
Add support for LoginUrl buttons
This commit is contained in:
parent
a94c3bb465
commit
182768a5d3
@ -385,6 +385,7 @@ def pyrogram_api():
|
|||||||
ReplyKeyboardRemove
|
ReplyKeyboardRemove
|
||||||
InlineKeyboardMarkup
|
InlineKeyboardMarkup
|
||||||
InlineKeyboardButton
|
InlineKeyboardButton
|
||||||
|
LoginUrl
|
||||||
ForceReply
|
ForceReply
|
||||||
CallbackQuery
|
CallbackQuery
|
||||||
GameHighScore
|
GameHighScore
|
||||||
|
@ -80,7 +80,7 @@ class SendGame(Scaffold):
|
|||||||
silent=disable_notification or None,
|
silent=disable_notification or None,
|
||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
reply_markup=reply_markup.write() if reply_markup else None
|
reply_markup=await reply_markup.write(self) if reply_markup else None
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ class EditInlineMedia(Scaffold):
|
|||||||
raw.functions.messages.EditInlineBotMessage(
|
raw.functions.messages.EditInlineBotMessage(
|
||||||
id=unpacked,
|
id=unpacked,
|
||||||
media=media,
|
media=media,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await self.parser.parse(caption, parse_mode)
|
**await self.parser.parse(caption, parse_mode)
|
||||||
),
|
),
|
||||||
sleep_threshold=self.sleep_threshold
|
sleep_threshold=self.sleep_threshold
|
||||||
|
@ -61,7 +61,7 @@ class EditInlineReplyMarkup(Scaffold):
|
|||||||
return await session.send(
|
return await session.send(
|
||||||
raw.functions.messages.EditInlineBotMessage(
|
raw.functions.messages.EditInlineBotMessage(
|
||||||
id=unpacked,
|
id=unpacked,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
),
|
),
|
||||||
sleep_threshold=self.sleep_threshold
|
sleep_threshold=self.sleep_threshold
|
||||||
)
|
)
|
||||||
|
@ -82,7 +82,7 @@ class EditInlineText(Scaffold):
|
|||||||
raw.functions.messages.EditInlineBotMessage(
|
raw.functions.messages.EditInlineBotMessage(
|
||||||
id=unpacked,
|
id=unpacked,
|
||||||
no_webpage=disable_web_page_preview or None,
|
no_webpage=disable_web_page_preview or None,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await self.parser.parse(text, parse_mode)
|
**await self.parser.parse(text, parse_mode)
|
||||||
),
|
),
|
||||||
sleep_threshold=self.sleep_threshold
|
sleep_threshold=self.sleep_threshold
|
||||||
|
@ -257,7 +257,7 @@ class EditMessageMedia(Scaffold):
|
|||||||
peer=await self.resolve_peer(chat_id),
|
peer=await self.resolve_peer(chat_id),
|
||||||
id=message_id,
|
id=message_id,
|
||||||
media=media,
|
media=media,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
message=message,
|
message=message,
|
||||||
entities=entities
|
entities=entities
|
||||||
)
|
)
|
||||||
|
@ -62,7 +62,7 @@ class EditMessageReplyMarkup(Scaffold):
|
|||||||
raw.functions.messages.EditMessage(
|
raw.functions.messages.EditMessage(
|
||||||
peer=await self.resolve_peer(chat_id),
|
peer=await self.resolve_peer(chat_id),
|
||||||
id=message_id,
|
id=message_id,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ class EditMessageText(Scaffold):
|
|||||||
peer=await self.resolve_peer(chat_id),
|
peer=await self.resolve_peer(chat_id),
|
||||||
id=message_id,
|
id=message_id,
|
||||||
no_webpage=disable_web_page_preview or None,
|
no_webpage=disable_web_page_preview or None,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await utils.parse_text_entities(self, text, parse_mode, entities)
|
**await utils.parse_text_entities(self, text, parse_mode, entities)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -222,7 +222,7 @@ class SendAnimation(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -217,7 +217,7 @@ class SendAudio(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -102,7 +102,7 @@ class SendCachedMedia(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -97,7 +97,7 @@ class SendContact(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None
|
reply_markup=await reply_markup.write(self) if reply_markup else None
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ class SendDice(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
message=""
|
message=""
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -194,7 +194,7 @@ class SendDocument(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -89,7 +89,7 @@ class SendLocation(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None
|
reply_markup=await reply_markup.write(self) if reply_markup else None
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ class SendMessage(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
message=message,
|
message=message,
|
||||||
entities=entities
|
entities=entities
|
||||||
)
|
)
|
||||||
|
@ -172,7 +172,7 @@ class SendPhoto(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -117,7 +117,7 @@ class SendPoll(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None
|
reply_markup=await reply_markup.write(self) if reply_markup else None
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ class SendSticker(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
message=""
|
message=""
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -113,7 +113,7 @@ class SendVenue(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None
|
reply_markup=await reply_markup.write(self) if reply_markup else None
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ class SendVideo(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -174,7 +174,7 @@ class SendVideoNote(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
message=""
|
message=""
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -178,7 +178,7 @@ class SendVoice(Scaffold):
|
|||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id(),
|
random_id=self.rnd_id(),
|
||||||
schedule_date=schedule_date,
|
schedule_date=schedule_date,
|
||||||
reply_markup=reply_markup.write() if reply_markup else None,
|
reply_markup=await reply_markup.write(self) if reply_markup else None,
|
||||||
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
**await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -68,7 +68,7 @@ class StopPoll(Scaffold):
|
|||||||
answers=[]
|
answers=[]
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
reply_markup=reply_markup.write() if reply_markup else None
|
reply_markup=await reply_markup.write(self) if reply_markup else None
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,10 +23,19 @@ from .game_high_score import GameHighScore
|
|||||||
from .inline_keyboard_button import InlineKeyboardButton
|
from .inline_keyboard_button import InlineKeyboardButton
|
||||||
from .inline_keyboard_markup import InlineKeyboardMarkup
|
from .inline_keyboard_markup import InlineKeyboardMarkup
|
||||||
from .keyboard_button import KeyboardButton
|
from .keyboard_button import KeyboardButton
|
||||||
|
from .login_url import LoginUrl
|
||||||
from .reply_keyboard_markup import ReplyKeyboardMarkup
|
from .reply_keyboard_markup import ReplyKeyboardMarkup
|
||||||
from .reply_keyboard_remove import ReplyKeyboardRemove
|
from .reply_keyboard_remove import ReplyKeyboardRemove
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"CallbackGame", "CallbackQuery", "ForceReply", "GameHighScore", "InlineKeyboardButton", "InlineKeyboardMarkup",
|
"CallbackGame",
|
||||||
"KeyboardButton", "ReplyKeyboardMarkup", "ReplyKeyboardRemove"
|
"CallbackQuery",
|
||||||
|
"ForceReply",
|
||||||
|
"GameHighScore",
|
||||||
|
"InlineKeyboardButton",
|
||||||
|
"InlineKeyboardMarkup",
|
||||||
|
"KeyboardButton",
|
||||||
|
"ReplyKeyboardMarkup",
|
||||||
|
"ReplyKeyboardRemove",
|
||||||
|
"LoginUrl"
|
||||||
]
|
]
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import pyrogram
|
||||||
from pyrogram import raw
|
from pyrogram import raw
|
||||||
|
|
||||||
from ..object import Object
|
from ..object import Object
|
||||||
@ -46,12 +47,12 @@ class ForceReply(Object):
|
|||||||
self.selective = selective
|
self.selective = selective
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def read(o):
|
def read(b):
|
||||||
return ForceReply(
|
return ForceReply(
|
||||||
selective=o.selective
|
selective=b.selective
|
||||||
)
|
)
|
||||||
|
|
||||||
def write(self):
|
async def write(self, _: "pyrogram.Client"):
|
||||||
return raw.types.ReplyKeyboardForceReply(
|
return raw.types.ReplyKeyboardForceReply(
|
||||||
single_use=True,
|
single_use=True,
|
||||||
selective=self.selective or None
|
selective=self.selective or None
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
|
import pyrogram
|
||||||
from pyrogram import raw
|
from pyrogram import raw
|
||||||
from pyrogram import types
|
from pyrogram import types
|
||||||
from ..object import Object
|
from ..object import Object
|
||||||
@ -38,6 +39,10 @@ class InlineKeyboardButton(Object):
|
|||||||
url (``str``, *optional*):
|
url (``str``, *optional*):
|
||||||
HTTP url to be opened when button is pressed.
|
HTTP url to be opened when button is pressed.
|
||||||
|
|
||||||
|
login_url (:obj:`~pyrogram.types.LoginUrl`, *optional*):
|
||||||
|
An HTTP URL used to automatically authorize the user. Can be used as a replacement for
|
||||||
|
the `Telegram Login Widget <https://core.telegram.org/widgets/login>`_.
|
||||||
|
|
||||||
switch_inline_query (``str``, *optional*):
|
switch_inline_query (``str``, *optional*):
|
||||||
If set, pressing the button will prompt the user to select one of their chats, open that chat and insert
|
If set, pressing the button will prompt the user to select one of their chats, open that chat and insert
|
||||||
the bot's username and the specified inline query in the input field. Can be empty, in which case just
|
the bot's username and the specified inline query in the input field. Can be empty, in which case just
|
||||||
@ -51,15 +56,18 @@ class InlineKeyboardButton(Object):
|
|||||||
chat's input field. Can be empty, in which case only the bot's username will be inserted.This offers a
|
chat's input field. Can be empty, in which case only the bot's username will be inserted.This offers a
|
||||||
quick way for the user to open your bot in inline mode in the same chat – good for selecting something
|
quick way for the user to open your bot in inline mode in the same chat – good for selecting something
|
||||||
from multiple options.
|
from multiple options.
|
||||||
"""
|
|
||||||
|
|
||||||
# TODO: Add callback_game and pay fields
|
callback_game (:obj:`~pyrogram.types.CallbackGame`, *optional*):
|
||||||
|
Description of the game that will be launched when the user presses the button.
|
||||||
|
**NOTE**: This type of button **must** always be the first button in the first row.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
text: str,
|
text: str,
|
||||||
callback_data: Union[str, bytes] = None,
|
callback_data: Union[str, bytes] = None,
|
||||||
url: str = None,
|
url: str = None,
|
||||||
|
login_url: "types.LoginUrl" = None,
|
||||||
switch_inline_query: str = None,
|
switch_inline_query: str = None,
|
||||||
switch_inline_query_current_chat: str = None,
|
switch_inline_query_current_chat: str = None,
|
||||||
callback_game: "types.CallbackGame" = None
|
callback_game: "types.CallbackGame" = None
|
||||||
@ -68,6 +76,7 @@ class InlineKeyboardButton(Object):
|
|||||||
|
|
||||||
self.text = str(text)
|
self.text = str(text)
|
||||||
self.url = url
|
self.url = url
|
||||||
|
self.login_url = login_url
|
||||||
self.callback_data = callback_data
|
self.callback_data = callback_data
|
||||||
self.switch_inline_query = switch_inline_query
|
self.switch_inline_query = switch_inline_query
|
||||||
self.switch_inline_query_current_chat = switch_inline_query_current_chat
|
self.switch_inline_query_current_chat = switch_inline_query_current_chat
|
||||||
@ -75,62 +84,86 @@ class InlineKeyboardButton(Object):
|
|||||||
# self.pay = pay
|
# self.pay = pay
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def read(o):
|
def read(b: "raw.base.KeyboardButton"):
|
||||||
if isinstance(o, raw.types.KeyboardButtonUrl):
|
if isinstance(b, raw.types.KeyboardButtonCallback):
|
||||||
return InlineKeyboardButton(
|
|
||||||
text=o.text,
|
|
||||||
url=o.url
|
|
||||||
)
|
|
||||||
|
|
||||||
if isinstance(o, raw.types.KeyboardButtonCallback):
|
|
||||||
# Try decode data to keep it as string, but if fails, fallback to bytes so we don't lose any information,
|
# Try decode data to keep it as string, but if fails, fallback to bytes so we don't lose any information,
|
||||||
# instead of decoding by ignoring/replacing errors.
|
# instead of decoding by ignoring/replacing errors.
|
||||||
try:
|
try:
|
||||||
data = o.data.decode()
|
data = b.data.decode()
|
||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError:
|
||||||
data = o.data
|
data = b.data
|
||||||
|
|
||||||
return InlineKeyboardButton(
|
return InlineKeyboardButton(
|
||||||
text=o.text,
|
text=b.text,
|
||||||
callback_data=data
|
callback_data=data
|
||||||
)
|
)
|
||||||
|
|
||||||
if isinstance(o, raw.types.KeyboardButtonSwitchInline):
|
if isinstance(b, raw.types.KeyboardButtonUrl):
|
||||||
if o.same_peer:
|
return InlineKeyboardButton(
|
||||||
|
text=b.text,
|
||||||
|
url=b.url
|
||||||
|
)
|
||||||
|
|
||||||
|
if isinstance(b, raw.types.KeyboardButtonUrlAuth):
|
||||||
|
return InlineKeyboardButton(
|
||||||
|
text=b.text,
|
||||||
|
login_url=types.LoginUrl.read(b)
|
||||||
|
)
|
||||||
|
|
||||||
|
if isinstance(b, raw.types.KeyboardButtonSwitchInline):
|
||||||
|
if b.same_peer:
|
||||||
return InlineKeyboardButton(
|
return InlineKeyboardButton(
|
||||||
text=o.text,
|
text=b.text,
|
||||||
switch_inline_query_current_chat=o.query
|
switch_inline_query_current_chat=b.query
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return InlineKeyboardButton(
|
return InlineKeyboardButton(
|
||||||
text=o.text,
|
text=b.text,
|
||||||
switch_inline_query=o.query
|
switch_inline_query=b.query
|
||||||
)
|
)
|
||||||
|
|
||||||
if isinstance(o, raw.types.KeyboardButtonGame):
|
if isinstance(b, raw.types.KeyboardButtonGame):
|
||||||
return InlineKeyboardButton(
|
return InlineKeyboardButton(
|
||||||
text=o.text,
|
text=b.text,
|
||||||
callback_game=types.CallbackGame()
|
callback_game=types.CallbackGame()
|
||||||
)
|
)
|
||||||
|
|
||||||
def write(self):
|
async def write(self, client: "pyrogram.Client"):
|
||||||
if self.callback_data is not None:
|
if self.callback_data:
|
||||||
# Telegram only wants bytes, but we are allowed to pass strings too, for convenience.
|
# Telegram only wants bytes, but we are allowed to pass strings too, for convenience.
|
||||||
data = bytes(self.callback_data, "utf-8") if isinstance(self.callback_data, str) else self.callback_data
|
data = bytes(self.callback_data, "utf-8") if isinstance(self.callback_data, str) else self.callback_data
|
||||||
return raw.types.KeyboardButtonCallback(text=self.text, data=data)
|
|
||||||
|
|
||||||
if self.url is not None:
|
return raw.types.KeyboardButtonCallback(
|
||||||
return raw.types.KeyboardButtonUrl(text=self.text, url=self.url)
|
text=self.text,
|
||||||
|
data=data
|
||||||
|
)
|
||||||
|
|
||||||
if self.switch_inline_query is not None:
|
if self.url:
|
||||||
return raw.types.KeyboardButtonSwitchInline(text=self.text, query=self.switch_inline_query)
|
return raw.types.KeyboardButtonUrl(
|
||||||
|
text=self.text,
|
||||||
|
url=self.url
|
||||||
|
)
|
||||||
|
|
||||||
if self.switch_inline_query_current_chat is not None:
|
if self.login_url:
|
||||||
|
return self.login_url.write(
|
||||||
|
text=self.text,
|
||||||
|
bot=await client.resolve_peer(self.login_url.bot_username)
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.switch_inline_query:
|
||||||
|
return raw.types.KeyboardButtonSwitchInline(
|
||||||
|
text=self.text,
|
||||||
|
query=self.switch_inline_query
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.switch_inline_query_current_chat:
|
||||||
return raw.types.KeyboardButtonSwitchInline(
|
return raw.types.KeyboardButtonSwitchInline(
|
||||||
text=self.text,
|
text=self.text,
|
||||||
query=self.switch_inline_query_current_chat,
|
query=self.switch_inline_query_current_chat,
|
||||||
same_peer=True
|
same_peer=True
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.callback_game is not None:
|
if self.callback_game:
|
||||||
return raw.types.KeyboardButtonGame(text=self.text)
|
return raw.types.KeyboardButtonGame(
|
||||||
|
text=self.text
|
||||||
|
)
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
|
import pyrogram
|
||||||
from pyrogram import raw
|
from pyrogram import raw
|
||||||
from pyrogram import types
|
from pyrogram import types
|
||||||
from ..object import Object
|
from ..object import Object
|
||||||
@ -52,9 +53,9 @@ class InlineKeyboardMarkup(Object):
|
|||||||
inline_keyboard=inline_keyboard
|
inline_keyboard=inline_keyboard
|
||||||
)
|
)
|
||||||
|
|
||||||
def write(self):
|
async def write(self, client: "pyrogram.Client"):
|
||||||
return raw.types.ReplyInlineMarkup(
|
return raw.types.ReplyInlineMarkup(
|
||||||
rows=[raw.types.KeyboardButtonRow(
|
rows=[raw.types.KeyboardButtonRow(
|
||||||
buttons=[j.write() for j in i]
|
buttons=[await j.write(client) for j in i]
|
||||||
) for i in self.inline_keyboard]
|
) for i in self.inline_keyboard]
|
||||||
)
|
)
|
||||||
|
@ -52,25 +52,23 @@ class KeyboardButton(Object):
|
|||||||
self.request_location = request_location
|
self.request_location = request_location
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def read(o):
|
def read(b):
|
||||||
if isinstance(o, raw.types.KeyboardButton):
|
if isinstance(b, raw.types.KeyboardButton):
|
||||||
return o.text
|
return b.text
|
||||||
|
|
||||||
if isinstance(o, raw.types.KeyboardButtonRequestPhone):
|
if isinstance(b, raw.types.KeyboardButtonRequestPhone):
|
||||||
return KeyboardButton(
|
return KeyboardButton(
|
||||||
text=o.text,
|
text=b.text,
|
||||||
request_contact=True
|
request_contact=True
|
||||||
)
|
)
|
||||||
|
|
||||||
if isinstance(o, raw.types.KeyboardButtonRequestGeoLocation):
|
if isinstance(b, raw.types.KeyboardButtonRequestGeoLocation):
|
||||||
return KeyboardButton(
|
return KeyboardButton(
|
||||||
text=o.text,
|
text=b.text,
|
||||||
request_location=True
|
request_location=True
|
||||||
)
|
)
|
||||||
|
|
||||||
def write(self):
|
def write(self):
|
||||||
# TODO: Enforce optional args mutual exclusiveness
|
|
||||||
|
|
||||||
if self.request_contact:
|
if self.request_contact:
|
||||||
return raw.types.KeyboardButtonRequestPhone(text=self.text)
|
return raw.types.KeyboardButtonRequestPhone(text=self.text)
|
||||||
elif self.request_location:
|
elif self.request_location:
|
||||||
|
89
pyrogram/types/bots_and_keyboards/login_url.py
Normal file
89
pyrogram/types/bots_and_keyboards/login_url.py
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
# Pyrogram - Telegram MTProto API Client Library for Python
|
||||||
|
# Copyright (C) 2017-2021 Dan <https://github.com/delivrance>
|
||||||
|
#
|
||||||
|
# This file is part of Pyrogram.
|
||||||
|
#
|
||||||
|
# Pyrogram is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License as published
|
||||||
|
# by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Pyrogram is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from pyrogram import raw
|
||||||
|
|
||||||
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
|
class LoginUrl(Object):
|
||||||
|
"""Represents a parameter of the inline keyboard button used to automatically authorize a user.
|
||||||
|
|
||||||
|
Serves as a great replacement for the Telegram Login Widget when the user is coming from Telegram.
|
||||||
|
All the user needs to do is tap/click a button and confirm that they want to log in.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
url (``str``):
|
||||||
|
An HTTP URL to be opened with user authorization data added to the query string when the button is pressed.
|
||||||
|
If the user refuses to provide authorization data, the original URL without information about the user will
|
||||||
|
be opened. The data added is the same as described in Receiving authorization data.
|
||||||
|
|
||||||
|
**NOTE**: You **must** always check the hash of the received data to verify the authentication and the
|
||||||
|
integrity of the data as described in
|
||||||
|
`Checking authorization <https://core.telegram.org/widgets/login#checking-authorization>`_.
|
||||||
|
|
||||||
|
forward_text (``str``, *optional*):
|
||||||
|
New text of the button in forwarded messages.
|
||||||
|
|
||||||
|
bot_username (``str``, *optional*):
|
||||||
|
Username of a bot, which will be used for user authorization.
|
||||||
|
See `Setting up <https://core.telegram.org/widgets/login#setting-up-a-bot>`_ a bot for more details.
|
||||||
|
If not specified, the current bot's username will be assumed. The url's domain must be the same as the
|
||||||
|
domain linked with the bot.
|
||||||
|
See `Linking your domain to the bot <https://core.telegram.org/widgets/login#linking-your-domain-to-the-bot>`_
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
request_write_access (``str``, *optional*):
|
||||||
|
Pass True to request the permission for your bot to send messages to the user.
|
||||||
|
|
||||||
|
button_id (``int``):
|
||||||
|
Button identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self, *,
|
||||||
|
url: str,
|
||||||
|
forward_text: str = None,
|
||||||
|
bot_username: str = None,
|
||||||
|
request_write_access: str = None,
|
||||||
|
button_id: int = None
|
||||||
|
):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self.url = url
|
||||||
|
self.forward_text = forward_text
|
||||||
|
self.bot_username = bot_username
|
||||||
|
self.request_write_access = request_write_access
|
||||||
|
self.button_id = button_id
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def read(b: "raw.types.KeyboardButtonUrlAuth") -> "LoginUrl":
|
||||||
|
return LoginUrl(
|
||||||
|
url=b.url,
|
||||||
|
forward_text=b.fwd_text,
|
||||||
|
button_id=b.button_id
|
||||||
|
)
|
||||||
|
|
||||||
|
def write(self, text: str, bot: "raw.types.InputUser"):
|
||||||
|
return raw.types.InputKeyboardButtonUrlAuth(
|
||||||
|
text=text,
|
||||||
|
url=self.url,
|
||||||
|
bot=bot,
|
||||||
|
fwd_text=self.forward_text,
|
||||||
|
request_write_access=self.request_write_access
|
||||||
|
)
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
from typing import List, Union
|
from typing import List, Union
|
||||||
|
|
||||||
|
import pyrogram
|
||||||
from pyrogram import raw
|
from pyrogram import raw
|
||||||
from pyrogram import types
|
from pyrogram import types
|
||||||
from ..object import Object
|
from ..object import Object
|
||||||
@ -81,7 +82,7 @@ class ReplyKeyboardMarkup(Object):
|
|||||||
selective=kb.selective
|
selective=kb.selective
|
||||||
)
|
)
|
||||||
|
|
||||||
def write(self):
|
async def write(self, _: "pyrogram.Client"):
|
||||||
return raw.types.ReplyKeyboardMarkup(
|
return raw.types.ReplyKeyboardMarkup(
|
||||||
rows=[raw.types.KeyboardButtonRow(
|
rows=[raw.types.KeyboardButtonRow(
|
||||||
buttons=[
|
buttons=[
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import pyrogram
|
||||||
from pyrogram import raw
|
from pyrogram import raw
|
||||||
from ..object import Object
|
from ..object import Object
|
||||||
|
|
||||||
@ -46,12 +47,12 @@ class ReplyKeyboardRemove(Object):
|
|||||||
self.selective = selective
|
self.selective = selective
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def read(o):
|
def read(b):
|
||||||
return ReplyKeyboardRemove(
|
return ReplyKeyboardRemove(
|
||||||
selective=o.selective
|
selective=b.selective
|
||||||
)
|
)
|
||||||
|
|
||||||
def write(self):
|
async def write(self, _: "pyrogram.Client"):
|
||||||
return raw.types.ReplyKeyboardHide(
|
return raw.types.ReplyKeyboardHide(
|
||||||
selective=self.selective or None
|
selective=self.selective or None
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user