mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2024-11-22 17:36:34 +03:00
Replace custom Box class with a single-item list for args by ref
This commit is contained in:
parent
09c04282c9
commit
021cb21686
|
@ -91,12 +91,6 @@ from .extensions import markdown, html
|
|||
__log__ = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class _Box:
|
||||
"""Helper class to pass parameters by reference"""
|
||||
def __init__(self, x=None):
|
||||
self.x = x
|
||||
|
||||
|
||||
class TelegramClient(TelegramBareClient):
|
||||
"""
|
||||
Initializes the Telegram client with the specified API ID and Hash.
|
||||
|
@ -525,7 +519,7 @@ class TelegramClient(TelegramBareClient):
|
|||
# region Dialogs ("chats") requests
|
||||
|
||||
def iter_dialogs(self, limit=None, offset_date=None, offset_id=0,
|
||||
offset_peer=InputPeerEmpty(), _total_box=None):
|
||||
offset_peer=InputPeerEmpty(), _total=None):
|
||||
"""
|
||||
Returns an iterator over the dialogs, yielding 'limit' at most.
|
||||
Dialogs are the open "chats" or conversations with other people.
|
||||
|
@ -547,15 +541,15 @@ class TelegramClient(TelegramBareClient):
|
|||
offset_peer (:obj:`InputPeer`, optional):
|
||||
The peer to be used as an offset.
|
||||
|
||||
_total_box (:obj:`_Box`, optional):
|
||||
A _Box instance to pass the total parameter by reference.
|
||||
_total (:obj:`list`, optional):
|
||||
A single-item list to pass the total parameter by reference.
|
||||
|
||||
Yields:
|
||||
Instances of :obj:`telethon.tl.custom.dialog.Dialog`.
|
||||
"""
|
||||
limit = float('inf') if limit is None else int(limit)
|
||||
if limit == 0:
|
||||
if not _total_box:
|
||||
if not _total:
|
||||
return
|
||||
# Special case, get a single dialog and determine count
|
||||
dialogs = self(GetDialogsRequest(
|
||||
|
@ -564,7 +558,7 @@ class TelegramClient(TelegramBareClient):
|
|||
offset_peer=offset_peer,
|
||||
limit=1
|
||||
))
|
||||
_total_box.x = getattr(dialogs, 'count', len(dialogs.dialogs))
|
||||
_total[0] = getattr(dialogs, 'count', len(dialogs.dialogs))
|
||||
return
|
||||
|
||||
seen = set()
|
||||
|
@ -578,8 +572,8 @@ class TelegramClient(TelegramBareClient):
|
|||
req.limit = min(limit - len(seen), 100)
|
||||
r = self(req)
|
||||
|
||||
if _total_box:
|
||||
_total_box.x = getattr(r, 'count', len(r.dialogs))
|
||||
if _total:
|
||||
_total[0] = getattr(r, 'count', len(r.dialogs))
|
||||
messages = {m.id: m for m in r.messages}
|
||||
entities = {utils.get_peer_id(x): x
|
||||
for x in itertools.chain(r.users, r.chats)}
|
||||
|
@ -609,10 +603,10 @@ class TelegramClient(TelegramBareClient):
|
|||
Same as :meth:`iter_dialogs`, but returns a list instead
|
||||
with an additional ``.total`` attribute on the list.
|
||||
"""
|
||||
total_box = _Box(0)
|
||||
kwargs['_total_box'] = total_box
|
||||
total = [0]
|
||||
kwargs['_total'] = total
|
||||
dialogs = UserList(self.iter_dialogs(*args, **kwargs))
|
||||
dialogs.total = total_box.x
|
||||
dialogs.total = total[0]
|
||||
return dialogs
|
||||
|
||||
def iter_drafts(self): # TODO: Ability to provide a `filter`
|
||||
|
@ -940,7 +934,7 @@ class TelegramClient(TelegramBareClient):
|
|||
|
||||
def iter_messages(self, entity, limit=20, offset_date=None,
|
||||
offset_id=0, max_id=0, min_id=0, add_offset=0,
|
||||
batch_size=100, wait_time=None, _total_box=None):
|
||||
batch_size=100, wait_time=None, _total=None):
|
||||
"""
|
||||
Iterator over the message history for the specified entity.
|
||||
|
||||
|
@ -986,8 +980,8 @@ class TelegramClient(TelegramBareClient):
|
|||
If left to ``None``, it will default to 1 second only if
|
||||
the limit is higher than 3000.
|
||||
|
||||
_total_box (:obj:`_Box`, optional):
|
||||
A _Box instance to pass the total parameter by reference.
|
||||
_total (:obj:`list`, optional):
|
||||
A single-item list to pass the total parameter by reference.
|
||||
|
||||
Yields:
|
||||
Instances of ``telethon.tl.types.Message`` with extra attributes:
|
||||
|
@ -1007,7 +1001,7 @@ class TelegramClient(TelegramBareClient):
|
|||
entity = self.get_input_entity(entity)
|
||||
limit = float('inf') if limit is None else int(limit)
|
||||
if limit == 0:
|
||||
if not _total_box:
|
||||
if not _total:
|
||||
return
|
||||
# No messages, but we still need to know the total message count
|
||||
result = self(GetHistoryRequest(
|
||||
|
@ -1015,7 +1009,7 @@ class TelegramClient(TelegramBareClient):
|
|||
offset_date=None, offset_id=0, max_id=0, min_id=0,
|
||||
add_offset=0, hash=0
|
||||
))
|
||||
_total_box.x = getattr(result, 'count', len(result.messages))
|
||||
_total[0] = getattr(result, 'count', len(result.messages))
|
||||
return
|
||||
|
||||
if wait_time is None:
|
||||
|
@ -1036,8 +1030,8 @@ class TelegramClient(TelegramBareClient):
|
|||
add_offset=add_offset,
|
||||
hash=0
|
||||
))
|
||||
if _total_box:
|
||||
_total_box.x = getattr(r, 'count', len(r.messages))
|
||||
if _total:
|
||||
_total[0] = getattr(r, 'count', len(r.messages))
|
||||
|
||||
entities = {utils.get_peer_id(x): x
|
||||
for x in itertools.chain(r.users, r.chats)}
|
||||
|
@ -1082,10 +1076,10 @@ class TelegramClient(TelegramBareClient):
|
|||
Same as :meth:`iter_messages`, but returns a list instead
|
||||
with an additional ``.total`` attribute on the list.
|
||||
"""
|
||||
total_box = _Box(0)
|
||||
kwargs['_total_box'] = total_box
|
||||
total = [0]
|
||||
kwargs['_total'] = total
|
||||
msgs = UserList(self.iter_messages(*args, **kwargs))
|
||||
msgs.total = total_box.x
|
||||
msgs.total = total[0]
|
||||
return msgs
|
||||
|
||||
def get_message_history(self, *args, **kwargs):
|
||||
|
@ -1161,7 +1155,7 @@ class TelegramClient(TelegramBareClient):
|
|||
raise TypeError('Invalid message type: {}'.format(type(message)))
|
||||
|
||||
def iter_participants(self, entity, limit=None, search='',
|
||||
filter=None, aggressive=False, _total_box=None):
|
||||
filter=None, aggressive=False, _total=None):
|
||||
"""
|
||||
Iterator over the participants belonging to the specified chat.
|
||||
|
||||
|
@ -1191,8 +1185,8 @@ class TelegramClient(TelegramBareClient):
|
|||
This has no effect for groups or channels with less than
|
||||
10,000 members, or if a ``filter`` is given.
|
||||
|
||||
_total_box (:obj:`_Box`, optional):
|
||||
A _Box instance to pass the total parameter by reference.
|
||||
_total (:obj:`list`, optional):
|
||||
A single-item list to pass the total parameter by reference.
|
||||
|
||||
Yields:
|
||||
The ``User`` objects returned by ``GetParticipantsRequest``
|
||||
|
@ -1220,8 +1214,8 @@ class TelegramClient(TelegramBareClient):
|
|||
total = self(GetFullChannelRequest(
|
||||
entity
|
||||
)).full_chat.participants_count
|
||||
if _total_box:
|
||||
_total_box.x = total
|
||||
if _total:
|
||||
_total[0] = total
|
||||
|
||||
if limit == 0:
|
||||
return
|
||||
|
@ -1281,8 +1275,8 @@ class TelegramClient(TelegramBareClient):
|
|||
elif isinstance(entity, InputPeerChat):
|
||||
# TODO We *could* apply the `filter` here ourselves
|
||||
full = self(GetFullChatRequest(entity.chat_id))
|
||||
if _total_box:
|
||||
_total_box.x = len(full.full_chat.participants.participants)
|
||||
if _total:
|
||||
_total[0] = len(full.full_chat.participants.participants)
|
||||
|
||||
have = 0
|
||||
users = {user.id: user for user in full.users}
|
||||
|
@ -1298,8 +1292,8 @@ class TelegramClient(TelegramBareClient):
|
|||
user.participant = participant
|
||||
yield user
|
||||
else:
|
||||
if _total_box:
|
||||
_total_box.x = 1
|
||||
if _total:
|
||||
_total[0] = 1
|
||||
if limit != 0:
|
||||
user = self.get_entity(entity)
|
||||
if filter_entity(user):
|
||||
|
@ -1311,10 +1305,10 @@ class TelegramClient(TelegramBareClient):
|
|||
Same as :meth:`iter_participants`, but returns a list instead
|
||||
with an additional ``.total`` attribute on the list.
|
||||
"""
|
||||
total_box = _Box(0)
|
||||
kwargs['_total_box'] = total_box
|
||||
total = [0]
|
||||
kwargs['_total'] = total
|
||||
participants = UserList(self.iter_participants(*args, **kwargs))
|
||||
participants.total = total_box.x
|
||||
participants.total = total[0]
|
||||
return participants
|
||||
|
||||
# endregion
|
||||
|
|
Loading…
Reference in New Issue
Block a user