mirror of
https://github.com/pyrogram/pyrogram
synced 2025-09-02 23:35:17 +00:00
Merge branch 'develop' into asyncio
# Conflicts: # pyrogram/client/dispatcher/dispatcher.py # pyrogram/client/methods/messages/get_history.py
This commit is contained in:
@@ -40,7 +40,8 @@ from .client.types import (
|
||||
Location, Message, MessageEntity, Dialog, Dialogs, Photo, PhotoSize, Sticker, User, UserStatus,
|
||||
UserProfilePhotos, Venue, Animation, Video, VideoNote, Voice, CallbackQuery, Messages, ForceReply,
|
||||
InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, ReplyKeyboardMarkup, ReplyKeyboardRemove,
|
||||
Poll, PollOption, ChatPreview, StopPropagation, Game, CallbackGame, GameHighScore, GameHighScores
|
||||
Poll, PollOption, ChatPreview, StopPropagation, ContinuePropagation, Game, CallbackGame, GameHighScore,
|
||||
GameHighScores
|
||||
)
|
||||
from .client import (
|
||||
Client, ChatAction, ParseMode, Emoji,
|
||||
|
@@ -141,8 +141,9 @@ class Client(Methods, BaseClient):
|
||||
Only applicable for new sessions.
|
||||
|
||||
first_name (``str``, *optional*):
|
||||
Pass a First Name to avoid entering it manually. It will be used to automatically
|
||||
create a new Telegram account in case the phone number you passed is not registered yet.
|
||||
Pass a First Name as string to avoid entering it manually. Or pass a callback function which accepts no
|
||||
arguments and must return the correct name as string (e.g., "Dan"). It will be used to automatically create
|
||||
a new Telegram account in case the phone number you passed is not registered yet.
|
||||
Only applicable for new sessions.
|
||||
|
||||
last_name (``str``, *optional*):
|
||||
@@ -160,7 +161,8 @@ class Client(Methods, BaseClient):
|
||||
Path of the configuration file. Defaults to ./config.ini
|
||||
|
||||
plugins (``dict``, *optional*):
|
||||
TODO: doctrings
|
||||
Your Smart Plugins settings as dict, e.g.: *dict(root="plugins")*.
|
||||
This is an alternative way to setup plugins if you don't want to use the *config.ini* file.
|
||||
|
||||
no_updates (``bool``, *optional*):
|
||||
Pass True to completely disable incoming updates for the current session.
|
||||
|
@@ -125,34 +125,36 @@ class Dispatcher:
|
||||
|
||||
parser = self.update_parsers.get(type(update), None)
|
||||
|
||||
if parser is None:
|
||||
continue
|
||||
|
||||
parsed_update, handler_type = await parser(update, users, chats)
|
||||
parsed_update, handler_type = (
|
||||
await parser(update, users, chats)
|
||||
if parser is not None
|
||||
else (None, type(None))
|
||||
)
|
||||
|
||||
for group in self.groups.values():
|
||||
try:
|
||||
for handler in group:
|
||||
args = None
|
||||
for handler in group:
|
||||
args = None
|
||||
|
||||
if isinstance(handler, RawUpdateHandler):
|
||||
args = (update, users, chats)
|
||||
elif isinstance(handler, handler_type):
|
||||
if handler.check(parsed_update):
|
||||
args = (parsed_update,)
|
||||
if isinstance(handler, handler_type):
|
||||
if handler.check(parsed_update):
|
||||
args = (parsed_update,)
|
||||
elif isinstance(handler, RawUpdateHandler):
|
||||
args = (update, users, chats)
|
||||
|
||||
if args is None:
|
||||
continue
|
||||
if args is None:
|
||||
continue
|
||||
|
||||
try:
|
||||
await handler.callback(self.client, *args)
|
||||
except StopIteration:
|
||||
raise
|
||||
except Exception as e:
|
||||
log.error(e, exc_info=True)
|
||||
try:
|
||||
await handler.callback(self.client, *args)
|
||||
except pyrogram.StopPropagation:
|
||||
raise
|
||||
except pyrogram.ContinuePropagation:
|
||||
continue
|
||||
except Exception as e:
|
||||
log.error(e, exc_info=True)
|
||||
|
||||
break
|
||||
except StopIteration:
|
||||
break
|
||||
except pyrogram.StopPropagation:
|
||||
pass
|
||||
except Exception as e:
|
||||
log.error(e, exc_info=True)
|
||||
|
@@ -45,10 +45,3 @@ class CallbackQueryHandler(Handler):
|
||||
|
||||
def __init__(self, callback: callable, filters=None):
|
||||
super().__init__(callback, filters)
|
||||
|
||||
def check(self, callback_query):
|
||||
return (
|
||||
self.filters(callback_query)
|
||||
if callable(self.filters)
|
||||
else True
|
||||
)
|
||||
|
@@ -48,8 +48,4 @@ class DeletedMessagesHandler(Handler):
|
||||
super().__init__(callback, filters)
|
||||
|
||||
def check(self, messages):
|
||||
return (
|
||||
self.filters(messages.messages[0])
|
||||
if callable(self.filters)
|
||||
else True
|
||||
)
|
||||
return super().check(messages.messages[0])
|
||||
|
@@ -21,3 +21,10 @@ class Handler:
|
||||
def __init__(self, callback: callable, filters=None):
|
||||
self.callback = callback
|
||||
self.filters = filters
|
||||
|
||||
def check(self, update):
|
||||
return (
|
||||
self.filters(update)
|
||||
if callable(self.filters)
|
||||
else True
|
||||
)
|
||||
|
@@ -46,10 +46,3 @@ class MessageHandler(Handler):
|
||||
|
||||
def __init__(self, callback: callable, filters=None):
|
||||
super().__init__(callback, filters)
|
||||
|
||||
def check(self, message):
|
||||
return (
|
||||
self.filters(message)
|
||||
if callable(self.filters)
|
||||
else True
|
||||
)
|
||||
|
@@ -45,10 +45,3 @@ class UserStatusHandler(Handler):
|
||||
|
||||
def __init__(self, callback: callable, filters=None):
|
||||
super().__init__(callback, filters)
|
||||
|
||||
def check(self, user_status):
|
||||
return (
|
||||
self.filters(user_status)
|
||||
if callable(self.filters)
|
||||
else True
|
||||
)
|
||||
|
@@ -16,12 +16,17 @@
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import logging
|
||||
import time
|
||||
from typing import Union
|
||||
|
||||
import pyrogram
|
||||
from pyrogram.api import functions
|
||||
from pyrogram.api.errors import FloodWait
|
||||
from ...ext import BaseClient
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class GetHistory(BaseClient):
|
||||
async def get_history(self,
|
||||
@@ -66,21 +71,28 @@ class GetHistory(BaseClient):
|
||||
:class:`Error <pyrogram.Error>` in case of a Telegram RPC error.
|
||||
"""
|
||||
|
||||
messages = await pyrogram.Messages._parse(
|
||||
self,
|
||||
await self.send(
|
||||
functions.messages.GetHistory(
|
||||
peer=await self.resolve_peer(chat_id),
|
||||
offset_id=offset_id,
|
||||
offset_date=offset_date,
|
||||
add_offset=offset * (-1 if reverse else 1) - (limit if reverse else 0),
|
||||
limit=limit,
|
||||
max_id=0,
|
||||
min_id=0,
|
||||
hash=0
|
||||
while True:
|
||||
try:
|
||||
messages = await pyrogram.Messages._parse(
|
||||
self,
|
||||
await self.send(
|
||||
functions.messages.GetHistory(
|
||||
peer=await self.resolve_peer(chat_id),
|
||||
offset_id=offset_id,
|
||||
offset_date=offset_date,
|
||||
add_offset=offset * (-1 if reverse else 1) - (limit if reverse else 0),
|
||||
limit=limit,
|
||||
max_id=0,
|
||||
min_id=0,
|
||||
hash=0
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
except FloodWait as e:
|
||||
log.warning("Sleeping for {}s".format(e.x))
|
||||
await asyncio.sleep(e.x)
|
||||
else:
|
||||
break
|
||||
|
||||
if reverse:
|
||||
messages.messages.reverse()
|
||||
|
@@ -30,7 +30,7 @@ from .messages_and_media import (
|
||||
Sticker, Venue, Video, VideoNote, Voice, UserProfilePhotos,
|
||||
Message, Messages, MessageEntity, Poll, PollOption, Game
|
||||
)
|
||||
from .update import StopPropagation
|
||||
from .update import StopPropagation, ContinuePropagation
|
||||
from .user_and_chats import (
|
||||
Chat, ChatMember, ChatMembers, ChatPhoto,
|
||||
Dialog, Dialogs, User, UserStatus, ChatPreview
|
||||
|
@@ -40,15 +40,15 @@ class CallbackQuery(PyrogramType, Update):
|
||||
Sender.
|
||||
|
||||
chat_instance (``str``, *optional*):
|
||||
Global identifier, uniquely corresponding to the chat to which the message with the callback button was
|
||||
sent. Useful for high scores in games.
|
||||
|
||||
message (:obj:`Message <pyrogram.Message>`, *optional*):
|
||||
Message with the callback button that originated the query. Note that message content and message date will
|
||||
not be available if the message is too old.
|
||||
|
||||
message (:obj:`Message <pyrogram.Message>`, *optional*):
|
||||
Identifier of the message sent via the bot in inline mode, that originated the query.
|
||||
|
||||
inline_message_id (``str``):
|
||||
Global identifier, uniquely corresponding to the chat to which the message with the callback button was
|
||||
sent. Useful for high scores in games.
|
||||
Identifier of the message sent via the bot in inline mode, that originated the query.
|
||||
|
||||
data (``bytes``, *optional*):
|
||||
Data associated with the callback button. Be aware that a bad client can send arbitrary data in this field.
|
||||
@@ -72,9 +72,9 @@ class CallbackQuery(PyrogramType, Update):
|
||||
|
||||
self.id = id
|
||||
self.from_user = from_user
|
||||
self.chat_instance = chat_instance
|
||||
self.message = message
|
||||
self.inline_message_id = inline_message_id
|
||||
self.chat_instance = chat_instance
|
||||
self.data = data
|
||||
self.game_short_name = game_short_name
|
||||
|
||||
|
@@ -21,6 +21,13 @@ class StopPropagation(StopIteration):
|
||||
pass
|
||||
|
||||
|
||||
class ContinuePropagation(StopIteration):
|
||||
pass
|
||||
|
||||
|
||||
class Update:
|
||||
def stop_propagation(self):
|
||||
raise StopPropagation
|
||||
|
||||
def continue_propagation(self):
|
||||
raise ContinuePropagation
|
||||
|
Reference in New Issue
Block a user