Compare commits
61 Commits
develop
...
4a79535321
| Author | SHA1 | Date | |
|---|---|---|---|
|
4a79535321
|
|||
|
425902d2ac
|
|||
|
6759e5c704
|
|||
|
db240ce199
|
|||
|
02386d69da
|
|||
|
cc4cbbacbd
|
|||
|
fd4374f328
|
|||
|
6b489363de
|
|||
|
a343e095e8
|
|||
|
a3b28bc1d6
|
|||
|
3969794075
|
|||
|
748ba624a4
|
|||
|
41507067be
|
|||
|
ec747bef1d
|
|||
|
199fe29cf1
|
|||
|
41f38d0b23
|
|||
|
cf492f0c8b
|
|||
|
eab81b065d
|
|||
|
51a77c695b
|
|||
|
febe5cee3f
|
|||
|
fb04211e81
|
|||
|
3bd1a9b679
|
|||
|
0c3ed2070d
|
|||
|
5c30dafd4c
|
|||
|
|
27f9d62cf9
|
||
|
fafa639328
|
|||
|
55b47ed1f7
|
|||
|
881d249256
|
|||
|
fc486c60ce
|
|||
|
e813d37c8f
|
|||
|
21f91fb07c
|
|||
|
50c2f92e8e
|
|||
|
d77c416ea6
|
|||
|
e487764aad
|
|||
|
4bf00f0cc5
|
|||
|
ed7e335d4e
|
|||
|
d6a4a1d69a
|
|||
|
668822fc21
|
|||
|
135442dcd6
|
|||
|
eb11160a02
|
|||
|
fda4cac348
|
|||
|
773fe1fdb1
|
|||
|
ddf25f8dd1
|
|||
|
17b26ec23e
|
|||
|
68974c4c40
|
|||
|
92e39e7ed7
|
|||
|
48b7e1e4a2
|
|||
|
b797f3fffe
|
|||
|
3e19ba4c81
|
|||
|
e29bb08b7b
|
|||
|
7233f9e478
|
|||
|
e481623a75
|
|||
|
|
88835955ef | ||
|
|
8c37d00602 | ||
|
|
ada375b766 | ||
|
|
ed05d843bc | ||
|
|
bc51ed109a | ||
|
|
76204ccd69 | ||
|
|
293a831958 | ||
|
|
fafc3de090 | ||
|
|
5fe875e49c |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -41,6 +41,7 @@ __pycache__/
|
|||||||
# Distribution / packaging
|
# Distribution / packaging
|
||||||
.Python
|
.Python
|
||||||
env/
|
env/
|
||||||
|
.venv/
|
||||||
build/
|
build/
|
||||||
develop-eggs/
|
develop-eggs/
|
||||||
dist/
|
dist/
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ __author__ = "Davide Testa"
|
|||||||
__email__ = "davide@davte.it"
|
__email__ = "davide@davte.it"
|
||||||
__credits__ = ["Marco Origlia", "Nick Lee @Nickoala"]
|
__credits__ = ["Marco Origlia", "Nick Lee @Nickoala"]
|
||||||
__license__ = "GNU General Public License v3.0"
|
__license__ = "GNU General Public License v3.0"
|
||||||
__version__ = "2.10.6"
|
__version__ = "2.10.9"
|
||||||
__maintainer__ = "Davide Testa"
|
__maintainer__ = "Davide Testa"
|
||||||
__contact__ = "t.me/davte"
|
__contact__ = "t.me/davte"
|
||||||
|
|
||||||
|
|||||||
@@ -1890,6 +1890,8 @@ async def create_promotion_command(bot: Bot):
|
|||||||
of the machine running the bot.
|
of the machine running the bot.
|
||||||
"""
|
"""
|
||||||
await bot.get_me()
|
await bot.get_me()
|
||||||
|
if len(bot.administrators) > 0:
|
||||||
|
return
|
||||||
bot.administration_token = get_secure_key(length=10)
|
bot.administration_token = get_secure_key(length=10)
|
||||||
print(f"To become administrator click "
|
print(f"To become administrator click "
|
||||||
f"https://t.me/{bot.name}?start="
|
f"https://t.me/{bot.name}?start="
|
||||||
@@ -2132,6 +2134,4 @@ def init(telegram_bot: Bot,
|
|||||||
update=update,
|
update=update,
|
||||||
user_record=user_record,
|
user_record=user_record,
|
||||||
language=language)
|
language=language)
|
||||||
|
|
||||||
if len(telegram_bot.administrators) == 0:
|
|
||||||
asyncio.ensure_future(create_promotion_command(bot=telegram_bot))
|
asyncio.ensure_future(create_promotion_command(bot=telegram_bot))
|
||||||
|
|||||||
@@ -457,6 +457,40 @@ class InputPaidMediaVideo(InputPaidMedia):
|
|||||||
self['supports_streaming'] = supports_streaming
|
self['supports_streaming'] = supports_streaming
|
||||||
|
|
||||||
|
|
||||||
|
class MessageEntity(DictToDump):
|
||||||
|
def __init__(self,
|
||||||
|
type_: str,
|
||||||
|
offset: int,
|
||||||
|
length: int,
|
||||||
|
url: str,
|
||||||
|
user: 'User',
|
||||||
|
language: str,
|
||||||
|
custom_emoji_id: str):
|
||||||
|
super().__init__()
|
||||||
|
self['type'] = type_
|
||||||
|
self['offset'] = offset
|
||||||
|
self['length'] = length
|
||||||
|
self['url'] = url
|
||||||
|
self['user'] = user
|
||||||
|
self['language'] = language
|
||||||
|
self['custom_emoji_id'] = custom_emoji_id
|
||||||
|
|
||||||
|
|
||||||
|
class PreparedInlineMessage(DictToDump):
|
||||||
|
"""Describes an inline message to be sent by a user of a Mini App.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
id (str): Unique identifier of the prepared message
|
||||||
|
expiration_date (int): Expiration date of the prepared message,
|
||||||
|
in Unix time. Expired prepared messages can no longer be used.
|
||||||
|
"""
|
||||||
|
def __init__(self,
|
||||||
|
id: str,
|
||||||
|
expiration_date: int):
|
||||||
|
super().__init__()
|
||||||
|
self['id'] = id
|
||||||
|
self['expiration_date'] = expiration_date
|
||||||
|
|
||||||
def handle_deprecated_disable_web_page_preview(parameters: dict,
|
def handle_deprecated_disable_web_page_preview(parameters: dict,
|
||||||
kwargs: dict):
|
kwargs: dict):
|
||||||
if 'disable_web_page_preview' in kwargs:
|
if 'disable_web_page_preview' in kwargs:
|
||||||
@@ -917,6 +951,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a text message. On success, return it.
|
"""Send a text message. On success, return it.
|
||||||
|
|
||||||
@@ -963,6 +998,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a photo from file_id, HTTP url or file.
|
"""Send a photo from file_id, HTTP url or file.
|
||||||
|
|
||||||
@@ -992,6 +1028,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send an audio file from file_id, HTTP url or file.
|
"""Send an audio file from file_id, HTTP url or file.
|
||||||
|
|
||||||
@@ -1024,6 +1061,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a document from file_id, HTTP url or file.
|
"""Send a document from file_id, HTTP url or file.
|
||||||
|
|
||||||
@@ -1061,6 +1099,7 @@ class TelegramBot:
|
|||||||
has_spoiler: bool = None,
|
has_spoiler: bool = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a video from file_id, HTTP url or file.
|
"""Send a video from file_id, HTTP url or file.
|
||||||
|
|
||||||
@@ -1097,6 +1136,7 @@ class TelegramBot:
|
|||||||
has_spoiler: bool = None,
|
has_spoiler: bool = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send animation files (GIF or H.264/MPEG-4 AVC video without sound).
|
"""Send animation files (GIF or H.264/MPEG-4 AVC video without sound).
|
||||||
|
|
||||||
@@ -1128,6 +1168,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send an audio file to be displayed as playable voice message.
|
"""Send an audio file to be displayed as playable voice message.
|
||||||
|
|
||||||
@@ -1154,6 +1195,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a rounded square mp4 video message of up to 1 minute long.
|
"""Send a rounded square mp4 video message of up to 1 minute long.
|
||||||
|
|
||||||
@@ -1180,6 +1222,7 @@ class TelegramBot:
|
|||||||
protect_content: bool = None,
|
protect_content: bool = None,
|
||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a group of photos or videos as an album.
|
"""Send a group of photos or videos as an album.
|
||||||
|
|
||||||
@@ -1209,6 +1252,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a point on the map. May be kept updated for a `live_period`.
|
"""Send a point on the map. May be kept updated for a `live_period`.
|
||||||
|
|
||||||
@@ -1296,6 +1340,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send information about a venue.
|
"""Send information about a venue.
|
||||||
|
|
||||||
@@ -1323,6 +1368,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a phone contact.
|
"""Send a phone contact.
|
||||||
|
|
||||||
@@ -1360,6 +1406,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a native poll in a group, a supergroup or channel.
|
"""Send a native poll in a group, a supergroup or channel.
|
||||||
|
|
||||||
@@ -1881,6 +1928,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send `.webp` stickers.
|
"""Send `.webp` stickers.
|
||||||
|
|
||||||
@@ -2100,6 +2148,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send an invoice.
|
"""Send an invoice.
|
||||||
|
|
||||||
@@ -2180,6 +2229,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a game.
|
"""Send a game.
|
||||||
|
|
||||||
@@ -2247,6 +2297,7 @@ class TelegramBot:
|
|||||||
message_effect_id: str = None,
|
message_effect_id: str = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Send a dice.
|
"""Send a dice.
|
||||||
|
|
||||||
@@ -2396,6 +2447,7 @@ class TelegramBot:
|
|||||||
disable_notification: bool = None,
|
disable_notification: bool = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
"""Use this method to copy messages of any kind.
|
"""Use this method to copy messages of any kind.
|
||||||
|
|
||||||
@@ -2758,11 +2810,27 @@ class TelegramBot:
|
|||||||
need_shipping_address: bool,
|
need_shipping_address: bool,
|
||||||
send_phone_number_to_provider: bool,
|
send_phone_number_to_provider: bool,
|
||||||
send_email_to_provider: bool,
|
send_email_to_provider: bool,
|
||||||
is_flexible: bool):
|
is_flexible: bool,
|
||||||
|
business_connection_id: str = None,
|
||||||
|
subscription_period: int = None
|
||||||
|
):
|
||||||
"""Use this method to create a link for an invoice.
|
"""Use this method to create a link for an invoice.
|
||||||
|
|
||||||
Returns the created invoice link as String on success.
|
Returns the created invoice link as String on success. See
|
||||||
See https://core.telegram.org/bots/api#createinvoicelink for details.
|
https://core.telegram.org/bots/api#createinvoicelink for details.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
business_connection_id (Optional[str]): Unique identifier of the
|
||||||
|
business connection on behalf of which the link will be created.
|
||||||
|
For payments in Telegram Stars only.
|
||||||
|
subscription_period (Optional[int]): The number of seconds the
|
||||||
|
subscription will be active for before the next payment. The
|
||||||
|
currency must be set to “XTR” (Telegram Stars) if the parameter
|
||||||
|
is used. Currently, it must always be 2592000 (30 days) if
|
||||||
|
specified. Any number of subscriptions can be active for a given
|
||||||
|
bot at the same time, including multiple concurrent
|
||||||
|
subscriptions from the same user.
|
||||||
|
Subscription price must no exceed 2500 Telegram Stars.
|
||||||
"""
|
"""
|
||||||
return await self.api_request(
|
return await self.api_request(
|
||||||
'createInvoiceLink',
|
'createInvoiceLink',
|
||||||
@@ -3109,6 +3177,7 @@ class TelegramBot:
|
|||||||
|
|
||||||
async def sendPaidMedia(self, chat_id: Union[int, str], star_count: int,
|
async def sendPaidMedia(self, chat_id: Union[int, str], star_count: int,
|
||||||
media: List[InputPaidMedia],
|
media: List[InputPaidMedia],
|
||||||
|
payload: str = None,
|
||||||
business_connection_id: str = None,
|
business_connection_id: str = None,
|
||||||
caption: str = None, parse_mode: str = None,
|
caption: str = None, parse_mode: str = None,
|
||||||
caption_entities: List[dict] = None,
|
caption_entities: List[dict] = None,
|
||||||
@@ -3116,6 +3185,7 @@ class TelegramBot:
|
|||||||
disable_notification: bool = None,
|
disable_notification: bool = None,
|
||||||
protect_content: bool = None,
|
protect_content: bool = None,
|
||||||
reply_parameters: ReplyParameters = None,
|
reply_parameters: ReplyParameters = None,
|
||||||
|
allow_paid_broadcast: bool = None,
|
||||||
reply_markup = None):
|
reply_markup = None):
|
||||||
"""Send paid media to channel chats.
|
"""Send paid media to channel chats.
|
||||||
|
|
||||||
@@ -3188,3 +3258,146 @@ class TelegramBot:
|
|||||||
'editChatSubscriptionInviteLink',
|
'editChatSubscriptionInviteLink',
|
||||||
parameters=locals()
|
parameters=locals()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def setUserEmojiStatus(self, user_id: int,
|
||||||
|
emoji_status_custom_emoji_id: str = None,
|
||||||
|
emoji_status_expiration_date: int = None):
|
||||||
|
"""Changes the emoji status for a given user that previously allowed the
|
||||||
|
bot to manage their emoji status via the Mini App method
|
||||||
|
requestEmojiStatusAccess.
|
||||||
|
|
||||||
|
Returns True on success.
|
||||||
|
See https://core.telegram.org/bots/api#setuseremojistatus for details.
|
||||||
|
"""
|
||||||
|
if emoji_status_custom_emoji_id is None:
|
||||||
|
emoji_status_custom_emoji_id = ''
|
||||||
|
return await self.api_request(
|
||||||
|
'setUserEmojiStatus',
|
||||||
|
parameters=locals()
|
||||||
|
)
|
||||||
|
|
||||||
|
async def getAvailableGifts(self):
|
||||||
|
"""Returns the list of gifts that can be sent by the bot to users.
|
||||||
|
|
||||||
|
Requires no parameters.
|
||||||
|
Returns a Gifts object.
|
||||||
|
See https://core.telegram.org/bots/api#getavailablegifts for details.
|
||||||
|
"""
|
||||||
|
return await self.api_request(
|
||||||
|
'getAvailableGifts',
|
||||||
|
parameters=locals()
|
||||||
|
)
|
||||||
|
|
||||||
|
async def sendGift(self, user_id: int, gift_id: str, pay_for_upgrade: bool,
|
||||||
|
text: str, text_parse_mode: str,
|
||||||
|
text_entities: List['MessageEntity']):
|
||||||
|
"""Sends a gift to the given user.
|
||||||
|
|
||||||
|
The gift can't be converted to Telegram Stars by the user.
|
||||||
|
Returns True on success.
|
||||||
|
See https://core.telegram.org/bots/api#sendgift for details.
|
||||||
|
"""
|
||||||
|
return await self.api_request(
|
||||||
|
'sendGift',
|
||||||
|
parameters=locals()
|
||||||
|
)
|
||||||
|
|
||||||
|
async def verifyUser(self, user_id: int,
|
||||||
|
custom_description: str = None):
|
||||||
|
"""Verifies a user on behalf of the organization which is represented by
|
||||||
|
the bot.
|
||||||
|
|
||||||
|
Returns True on success.
|
||||||
|
See https://core.telegram.org/bots/api#verifyuser for details.
|
||||||
|
"""
|
||||||
|
if len(custom_description) > 70:
|
||||||
|
raise TypeError("Parameter `custom_description` is too long "
|
||||||
|
"(0-70 characters).")
|
||||||
|
return await self.api_request(
|
||||||
|
'verifyUser',
|
||||||
|
parameters=locals()
|
||||||
|
)
|
||||||
|
|
||||||
|
async def verifyChat(self, chat_id: Union[int, str],
|
||||||
|
custom_description: str = None):
|
||||||
|
"""Verifies a chat on behalf of the organization which is represented by
|
||||||
|
the bot.
|
||||||
|
|
||||||
|
Returns True on success.
|
||||||
|
See https://core.telegram.org/bots/api#verifychat for details.
|
||||||
|
"""
|
||||||
|
if isinstance(chat_id, str) and chat_id.isnumeric():
|
||||||
|
chat_id = int(chat_id)
|
||||||
|
if not (isinstance(chat_id, int) or
|
||||||
|
(isinstance(chat_id, str) and chat_id.startswith('@'))):
|
||||||
|
raise TypeError(f"Invalid chat_id: `{chat_id}`")
|
||||||
|
if len(custom_description) > 70:
|
||||||
|
raise TypeError("Parameter `custom_description` is too long "
|
||||||
|
"(0-70 characters).")
|
||||||
|
return await self.api_request(
|
||||||
|
'verifyChat',
|
||||||
|
parameters=locals()
|
||||||
|
)
|
||||||
|
|
||||||
|
async def removeUserVerification(self, user_id: int):
|
||||||
|
"""Removes verification from a user who is currently verified on behalf
|
||||||
|
of the organization represented by the bot.
|
||||||
|
|
||||||
|
Returns True on success.
|
||||||
|
See https://core.telegram.org/bots/api#removeuserverification for
|
||||||
|
details.
|
||||||
|
"""
|
||||||
|
return await self.api_request(
|
||||||
|
'removeUserVerification',
|
||||||
|
parameters=locals()
|
||||||
|
)
|
||||||
|
|
||||||
|
async def removeChatVerification(self, chat_id: Union[int, str]):
|
||||||
|
"""Removes verification from a chat that is currently verified on behalf
|
||||||
|
of the organization represented by the bot.
|
||||||
|
|
||||||
|
Returns True on success.
|
||||||
|
See https://core.telegram.org/bots/api#removechatverification for
|
||||||
|
details.
|
||||||
|
"""
|
||||||
|
if not (isinstance(chat_id, int) or
|
||||||
|
(isinstance(chat_id, str) and chat_id.startswith('@'))):
|
||||||
|
raise TypeError(f"Invalid chat_id: `{chat_id}`")
|
||||||
|
return await self.api_request(
|
||||||
|
'removeChatVerification',
|
||||||
|
parameters=locals()
|
||||||
|
)
|
||||||
|
|
||||||
|
async def savePreparedInlineMessage(self,
|
||||||
|
user_id: int,
|
||||||
|
result: 'InlineQueryResult',
|
||||||
|
allow_user_chats: bool = None,
|
||||||
|
allow_bot_chats: bool = None,
|
||||||
|
allow_group_chats: bool = None,
|
||||||
|
allow_channel_chats: bool = None
|
||||||
|
) -> 'PreparedInlineMessage':
|
||||||
|
"""Stores a message that can be sent by a user of a Mini App.
|
||||||
|
|
||||||
|
Returns a PreparedInlineMessage object.
|
||||||
|
See https://core.telegram.org/bots/api#savepreparedinlinemessage for
|
||||||
|
details.
|
||||||
|
"""
|
||||||
|
return await self.api_request(
|
||||||
|
'savePreparedInlineMessage',
|
||||||
|
parameters=locals()
|
||||||
|
)
|
||||||
|
|
||||||
|
async def editUserStarSubscription(self, user_id: int,
|
||||||
|
telegram_payment_charge_id: str,
|
||||||
|
is_canceled: bool):
|
||||||
|
"""Allows the bot to cancel or re-enable extension of a subscription
|
||||||
|
paid in Telegram Stars.
|
||||||
|
|
||||||
|
Returns True on success.
|
||||||
|
See https://core.telegram.org/bots/api#edituserstarsubscription for
|
||||||
|
details.
|
||||||
|
"""
|
||||||
|
return await self.api_request(
|
||||||
|
'editUserStarSubscription',
|
||||||
|
parameters=locals()
|
||||||
|
)
|
||||||
|
|||||||
@@ -122,12 +122,47 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
|
|||||||
'edited_message': self.edited_message_handler,
|
'edited_message': self.edited_message_handler,
|
||||||
'channel_post': self.channel_post_handler,
|
'channel_post': self.channel_post_handler,
|
||||||
'edited_channel_post': self.edited_channel_post_handler,
|
'edited_channel_post': self.edited_channel_post_handler,
|
||||||
|
'business_connection': self.get_update_handler(
|
||||||
|
update_type='business_connection'
|
||||||
|
),
|
||||||
|
'business_message': self.get_update_handler(
|
||||||
|
update_type='business_message'
|
||||||
|
),
|
||||||
|
'edited_business_message': self.get_update_handler(
|
||||||
|
update_type='edited_business_message'
|
||||||
|
),
|
||||||
|
'deleted_business_messages': self.get_update_handler(
|
||||||
|
update_type='deleted_business_messages'
|
||||||
|
),
|
||||||
|
'message_reaction': self.get_update_handler(
|
||||||
|
update_type='message_reaction'
|
||||||
|
),
|
||||||
|
'message_reaction_count': self.get_update_handler(
|
||||||
|
update_type='message_reaction_count'
|
||||||
|
),
|
||||||
'inline_query': self.inline_query_handler,
|
'inline_query': self.inline_query_handler,
|
||||||
'chosen_inline_result': self.chosen_inline_result_handler,
|
'chosen_inline_result': self.chosen_inline_result_handler,
|
||||||
'callback_query': self.callback_query_handler,
|
'callback_query': self.callback_query_handler,
|
||||||
'shipping_query': self.shipping_query_handler,
|
'shipping_query': self.shipping_query_handler,
|
||||||
'pre_checkout_query': self.pre_checkout_query_handler,
|
'pre_checkout_query': self.pre_checkout_query_handler,
|
||||||
|
'purchased_paid_media': self.get_update_handler(
|
||||||
|
update_type='purchased_paid_media'
|
||||||
|
),
|
||||||
'poll': self.poll_handler,
|
'poll': self.poll_handler,
|
||||||
|
'poll_answer': self.get_update_handler(
|
||||||
|
update_type='poll_answer'
|
||||||
|
),
|
||||||
|
'my_chat_member': self.get_update_handler(
|
||||||
|
update_type='my_chat_member'
|
||||||
|
),
|
||||||
|
'chat_member': self.get_update_handler( update_type='chat_member' ),
|
||||||
|
'chat_join_request': self.get_update_handler(
|
||||||
|
update_type='chat_join_request'
|
||||||
|
),
|
||||||
|
'chat_boost': self.get_update_handler( update_type='chat_boost' ),
|
||||||
|
'removed_chat_boost': self.get_update_handler(
|
||||||
|
update_type='removed_chat_boost'
|
||||||
|
),
|
||||||
}
|
}
|
||||||
# Different message update types need different handlers
|
# Different message update types need different handlers
|
||||||
self.message_handlers = {
|
self.message_handlers = {
|
||||||
@@ -221,6 +256,8 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
|
|||||||
self.Role = None
|
self.Role = None
|
||||||
self.packages = [sys.modules['davtelepot']]
|
self.packages = [sys.modules['davtelepot']]
|
||||||
self._documents_max_dimension = None
|
self._documents_max_dimension = None
|
||||||
|
self._getting_me = False
|
||||||
|
self._got_me = False
|
||||||
# Add `users` table with its fields if missing
|
# Add `users` table with its fields if missing
|
||||||
if 'users' not in self.db.tables:
|
if 'users' not in self.db.tables:
|
||||||
table = self.db.create_table(
|
table = self.db.create_table(
|
||||||
@@ -680,6 +717,18 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def get_update_handler(self, update_type: str):
|
||||||
|
"""Get update handler for `update_type`."""
|
||||||
|
bot = self
|
||||||
|
async def handler(update, user_record, language=None):
|
||||||
|
"""Handle update message of type `update_type`"""
|
||||||
|
logging.info(
|
||||||
|
"The following update was received: %s\n"
|
||||||
|
"However, this `%s` handler does nothing yet.",
|
||||||
|
update, update_type
|
||||||
|
)
|
||||||
|
return handler
|
||||||
|
|
||||||
async def edited_channel_post_handler(self, update, user_record, language=None):
|
async def edited_channel_post_handler(self, update, user_record, language=None):
|
||||||
"""Handle Telegram `edited_channel_post` update."""
|
"""Handle Telegram `edited_channel_post` update."""
|
||||||
logging.info(
|
logging.info(
|
||||||
@@ -2804,9 +2853,7 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
|
|||||||
"""
|
"""
|
||||||
if not callable(condition):
|
if not callable(condition):
|
||||||
raise TypeError(
|
raise TypeError(
|
||||||
'Condition {c} is not a callable'.format(
|
f'Condition {condition.__name__} is not a callable'
|
||||||
c=condition.__name__
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def query_decorator(handler):
|
def query_decorator(handler):
|
||||||
@@ -3147,26 +3194,41 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
|
|||||||
|
|
||||||
Restart bots if bot can't be got.
|
Restart bots if bot can't be got.
|
||||||
"""
|
"""
|
||||||
|
for _ in range(60):
|
||||||
|
if not self._getting_me:
|
||||||
|
break
|
||||||
|
await asyncio.sleep(0.5)
|
||||||
|
else:
|
||||||
|
raise TimeoutError("Getting bot information was in progress but "
|
||||||
|
"did not make it in 30 seconds...")
|
||||||
|
if self._got_me:
|
||||||
|
return
|
||||||
|
self._getting_me = True
|
||||||
try:
|
try:
|
||||||
me = await self.getMe()
|
me = await self.getMe()
|
||||||
if isinstance(me, Exception):
|
if isinstance(me, Exception):
|
||||||
raise me
|
raise me
|
||||||
elif me is None:
|
if me is None:
|
||||||
raise Exception('getMe returned None')
|
raise TypeError('getMe returned None')
|
||||||
self._name = me["username"]
|
self._name = me["username"]
|
||||||
self._telegram_id = me['id']
|
self._telegram_id = me['id']
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(
|
logging.error(
|
||||||
f"API getMe method failed, information about this bot could "
|
"API getMe method failed, information about this bot could "
|
||||||
f"not be retrieved. Restarting in 5 minutes...\n\n"
|
"not be retrieved. Restarting in 5 minutes...\n\n"
|
||||||
f"Error information:\n{e}"
|
"Error information:\n%s", e
|
||||||
)
|
)
|
||||||
|
self._getting_me = False
|
||||||
await asyncio.sleep(5*60)
|
await asyncio.sleep(5*60)
|
||||||
|
if self._got_me:
|
||||||
|
return
|
||||||
self.__class__.stop(
|
self.__class__.stop(
|
||||||
message="Information about this bot could not be retrieved.\n"
|
message="Information about this bot could not be retrieved.\n"
|
||||||
"Restarting...",
|
"Restarting...",
|
||||||
final_state=65
|
final_state=65
|
||||||
)
|
)
|
||||||
|
self._getting_me = False
|
||||||
|
self._got_me = True
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
"""Make bot ask for updates and handle responses."""
|
"""Make bot ask for updates and handle responses."""
|
||||||
@@ -3181,9 +3243,11 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
|
|||||||
|
|
||||||
async def close_sessions(self):
|
async def close_sessions(self):
|
||||||
"""Close open sessions."""
|
"""Close open sessions."""
|
||||||
for session_name, session in self.sessions.items():
|
for session_name in list(self.sessions.keys()):
|
||||||
|
session = self.sessions[session_name]
|
||||||
if not session.closed:
|
if not session.closed:
|
||||||
await session.close()
|
await session.close()
|
||||||
|
del self.sessions[session_name]
|
||||||
|
|
||||||
async def send_one_message(self, *args, **kwargs):
|
async def send_one_message(self, *args, **kwargs):
|
||||||
sent_message = await self.send_message(*args, **kwargs)
|
sent_message = await self.send_message(*args, **kwargs)
|
||||||
|
|||||||
Reference in New Issue
Block a user