2
0
mirror of https://github.com/pyrogram/pyrogram synced 2025-08-23 18:37:26 +00:00

Revamp get_dialogs. Fixes #13

This commit is contained in:
Dan 2018-02-09 02:57:08 +01:00
parent b1064015f6
commit a0bd47fee4

View File

@ -43,8 +43,7 @@ from pyrogram.api.errors import (
) )
from pyrogram.api.types import ( from pyrogram.api.types import (
User, Chat, Channel, User, Chat, Channel,
PeerUser, PeerChat, PeerChannel, PeerUser, PeerChannel,
Dialog, Message,
InputPeerEmpty, InputPeerSelf, InputPeerEmpty, InputPeerSelf,
InputPeerUser, InputPeerChat, InputPeerChannel InputPeerUser, InputPeerChat, InputPeerChannel
) )
@ -221,7 +220,7 @@ class Client:
self.peers_by_id[user_id] = input_peer self.peers_by_id[user_id] = input_peer
if username is not None: if username is not None:
self.peers_by_id[username] = input_peer self.peers_by_username[username] = input_peer
if isinstance(entity, Chat): if isinstance(entity, Chat):
chat_id = entity.id chat_id = entity.id
@ -580,53 +579,17 @@ class Client:
) )
def get_dialogs(self): def get_dialogs(self):
peers = [] def parse_dialogs(d):
self.fetch_peers(d.chats)
self.fetch_peers(d.users)
def parse_dialogs(d) -> int: for m in reversed(d.messages):
oldest_date = 1 << 32 if isinstance(m, types.MessageEmpty):
for dialog in d.dialogs: # type: Dialog
# Only search for Users, Chats and Channels
if not isinstance(dialog.peer, (PeerUser, PeerChat, PeerChannel)):
continue continue
if isinstance(dialog.peer, PeerUser):
peer_type = "user"
peer_id = dialog.peer.user_id
elif isinstance(dialog.peer, PeerChat):
peer_type = "chat"
peer_id = dialog.peer.chat_id
elif isinstance(dialog.peer, PeerChannel):
peer_type = "channel"
peer_id = dialog.peer.channel_id
else: else:
continue return m.date
else:
for message in d.messages: # type: Message return 0
is_this = peer_id == message.from_id or dialog.peer == message.to_id
if is_this:
for entity in (d.users if peer_type == "user" else d.chats): # type: User or Chat or Channel
if entity.id == peer_id:
peers.append(
dict(
id=peer_id,
access_hash=getattr(entity, "access_hash", None),
type=peer_type,
first_name=getattr(entity, "first_name", None),
last_name=getattr(entity, "last_name", None),
title=getattr(entity, "title", None),
username=getattr(entity, "username", None),
)
)
if message.date < oldest_date:
oldest_date = message.date
break
break
return oldest_date
pinned_dialogs = self.send(functions.messages.GetPinnedDialogs()) pinned_dialogs = self.send(functions.messages.GetPinnedDialogs())
parse_dialogs(pinned_dialogs) parse_dialogs(pinned_dialogs)
@ -639,7 +602,7 @@ class Client:
) )
offset_date = parse_dialogs(dialogs) offset_date = parse_dialogs(dialogs)
log.info("Dialogs count: {}".format(len(peers))) log.info("Entities count: {}".format(len(self.peers_by_id)))
while len(dialogs.dialogs) == self.DIALOGS_AT_ONCE: while len(dialogs.dialogs) == self.DIALOGS_AT_ONCE:
try: try:
@ -655,37 +618,7 @@ class Client:
continue continue
offset_date = parse_dialogs(dialogs) offset_date = parse_dialogs(dialogs)
log.info("Dialogs count: {}".format(len(peers))) log.info("Entities count: {}".format(len(self.peers_by_id)))
for i in peers:
peer_id = i["id"]
peer_type = i["type"]
peer_username = i["username"]
peer_access_hash = i["access_hash"]
if peer_type == "user":
input_peer = InputPeerUser(
peer_id,
peer_access_hash
)
elif peer_type == "chat":
input_peer = InputPeerChat(
peer_id
)
elif peer_type == "channel":
input_peer = InputPeerChannel(
peer_id,
peer_access_hash
)
peer_id = int("-100" + str(peer_id))
else:
continue
self.peers_by_id[peer_id] = input_peer
if peer_username:
peer_username = peer_username.lower()
self.peers_by_username[peer_username] = input_peer
def resolve_username(self, username: str): def resolve_username(self, username: str):
username = username.lower().strip("@") username = username.lower().strip("@")