2
0
mirror of https://github.com/pyrogram/pyrogram synced 2025-08-28 21:07:59 +00:00

Use the correct way to parse peer identifiers

This commit is contained in:
Dan 2019-08-01 19:07:08 +02:00
parent 9ad5e62dea
commit ad0f8284f6
8 changed files with 80 additions and 71 deletions

View File

@ -1015,7 +1015,7 @@ class Client(Methods, BaseClient):
access_hash = 0
peer_type = "group"
elif isinstance(peer, (types.Channel, types.ChannelForbidden)):
peer_id = int("-100" + str(peer.id))
peer_id = utils.get_channel_id(peer.id)
access_hash = peer.access_hash
username = getattr(peer, "username", None)
@ -1131,7 +1131,7 @@ class Client(Methods, BaseClient):
try:
diff = self.send(
functions.updates.GetChannelDifference(
channel=self.resolve_peer(int("-100" + str(channel_id))),
channel=self.resolve_peer(utils.get_channel_id(channel_id)),
filter=types.ChannelMessagesFilter(
ranges=[types.MessageRange(
min_id=update.message.id,
@ -1519,33 +1519,38 @@ class Client(Methods, BaseClient):
except KeyError:
raise PeerIdInvalid
if peer_id > 0:
peer_type = utils.get_type(peer_id)
if peer_type == "user":
self.fetch_peers(
self.send(
functions.users.GetUsers(
id=[types.InputUser(
id=[
types.InputUser(
user_id=peer_id,
access_hash=0
)]
)
]
)
)
)
else:
if str(peer_id).startswith("-100"):
self.send(
functions.channels.GetChannels(
id=[types.InputChannel(
channel_id=int(str(peer_id)[4:]),
access_hash=0
)]
)
)
else:
elif peer_type == "chat":
self.send(
functions.messages.GetChats(
id=[-peer_id]
)
)
else:
self.send(
functions.channels.GetChannels(
id=[
types.InputChannel(
channel_id=utils.get_channel_id(peer_id),
access_hash=0
)
]
)
)
try:
return self.storage.get_peer_by_id(peer_id)

View File

@ -18,10 +18,11 @@
import base64
import struct
from typing import Union, List
from typing import List
from typing import Union
import pyrogram
from pyrogram.api.types import PeerUser, PeerChat, PeerChannel
from . import BaseClient
from ...api import types
@ -62,23 +63,6 @@ def encode(s: bytes) -> str:
return base64.urlsafe_b64encode(r).decode().rstrip("=")
def get_peer_id(input_peer) -> int:
return (
input_peer.user_id if isinstance(input_peer, types.InputPeerUser)
else -input_peer.chat_id if isinstance(input_peer, types.InputPeerChat)
else int("-100" + str(input_peer.channel_id))
)
def get_input_peer(peer_id: int, access_hash: int):
return (
types.InputPeerUser(user_id=peer_id, access_hash=access_hash) if peer_id > 0
else types.InputPeerChannel(channel_id=int(str(peer_id)[4:]), access_hash=access_hash)
if (str(peer_id).startswith("-100") and access_hash)
else types.InputPeerChat(chat_id=-peer_id)
)
def get_offset_date(dialogs):
for m in reversed(dialogs.messages):
if isinstance(m, types.MessageEmpty):
@ -183,7 +167,7 @@ def parse_deleted_messages(client, update) -> List["pyrogram.Message"]:
pyrogram.Message(
message_id=message,
chat=pyrogram.Chat(
id=int("-100" + str(channel_id)),
id=get_channel_id(channel_id),
type="channel",
client=client
) if channel_id is not None else None,
@ -203,3 +187,39 @@ def unpack_inline_message_id(inline_message_id: str) -> types.InputBotInlineMess
id=r[1],
access_hash=r[2]
)
MIN_CHANNEL_ID = -1002147483647
MAX_CHANNEL_ID = -1000000000000
MIN_CHAT_ID = -2147483647
MAX_USER_ID = 2147483647
def get_peer_id(peer: Union[PeerUser, PeerChat, PeerChannel]) -> int:
if isinstance(peer, PeerUser):
return peer.user_id
if isinstance(peer, PeerChat):
return -peer.chat_id
if isinstance(peer, PeerChannel):
return MAX_CHANNEL_ID - peer.channel_id
raise ValueError("Peer type invalid: {}".format(peer))
def get_type(peer_id: int) -> str:
if peer_id < 0:
if MIN_CHAT_ID <= peer_id:
return "chat"
if MIN_CHANNEL_ID <= peer_id < MAX_CHANNEL_ID:
return "channel"
elif 0 < peer_id <= MAX_USER_ID:
return "user"
raise ValueError("Peer id invalid: {}".format(peer_id))
def get_channel_id(peer_id: int) -> int:
return MAX_CHANNEL_ID - peer_id

View File

@ -20,7 +20,7 @@ from typing import Union
import pyrogram
from pyrogram.api import functions, types
from ...ext import BaseClient
from ...ext import BaseClient, utils
class GetChat(BaseClient):
@ -70,7 +70,7 @@ class GetChat(BaseClient):
chat_id = -r.chat.id
if isinstance(r.chat, types.Channel):
chat_id = int("-100" + str(r.chat.id))
chat_id = utils.get_channel_id(r.chat.id)
peer = self.resolve_peer(chat_id)

View File

@ -23,7 +23,7 @@ from typing import List
import pyrogram
from pyrogram.api import functions, types
from pyrogram.errors import FloodWait
from ...ext import BaseClient
from ...ext import BaseClient, utils
log = logging.getLogger(__name__)
@ -100,10 +100,8 @@ class GetDialogs(BaseClient):
chat_id = to_id.user_id
else:
chat_id = message.from_id
elif isinstance(to_id, types.PeerChat):
chat_id = -to_id.chat_id
else:
chat_id = int("-100" + str(to_id.channel_id))
chat_id = utils.get_peer_id(to_id)
messages[chat_id] = pyrogram.Message._parse(self, message, users, chats)

View File

@ -25,6 +25,7 @@ from pyrogram.api import types
from ..object import Object
from ..update import Update
from ..user_and_chats import User
from ...ext import utils
class CallbackQuery(Object, Update):
@ -90,16 +91,7 @@ class CallbackQuery(Object, Update):
inline_message_id = None
if isinstance(callback_query, types.UpdateBotCallbackQuery):
peer = callback_query.peer
if isinstance(peer, types.PeerUser):
peer_id = peer.user_id
elif isinstance(peer, types.PeerChat):
peer_id = -peer.chat_id
else:
peer_id = int("-100" + str(peer.channel_id))
message = client.get_messages(peer_id, callback_query.msg_id)
message = client.get_messages(utils.get_peer_id(callback_query.peer), callback_query.msg_id)
elif isinstance(callback_query, types.UpdateInlineBotCallbackQuery):
inline_message_id = b64encode(
pack(

View File

@ -31,7 +31,8 @@ from ..object import Object
from ..update import Update
from ..user_and_chats.chat import Chat
from ..user_and_chats.user import User
from ...parser import utils, Parser
from ...ext import utils
from ...parser import utils as parser_utils, Parser
class Str(str):
@ -54,7 +55,7 @@ class Str(str):
return Parser.unparse(self, self.entities, True)
def __getitem__(self, item):
return utils.remove_surrogates(utils.add_surrogates(self)[item])
return parser_utils.remove_surrogates(parser_utils.add_surrogates(self)[item])
class Message(Object, Update):
@ -446,7 +447,7 @@ class Message(Object, Update):
new_chat_title=new_chat_title,
new_chat_photo=new_chat_photo,
delete_chat_photo=delete_chat_photo,
migrate_to_chat_id=int("-100" + str(migrate_to_chat_id)) if migrate_to_chat_id else None,
migrate_to_chat_id=utils.get_channel_id(migrate_to_chat_id) if migrate_to_chat_id else None,
migrate_from_chat_id=-migrate_from_chat_id if migrate_from_chat_id else None,
group_chat_created=group_chat_created,
channel_chat_created=channel_chat_created,

View File

@ -23,6 +23,7 @@ from pyrogram.api import types
from .chat_permissions import ChatPermissions
from .chat_photo import ChatPhoto
from ..object import Object
from ...ext import utils
class Chat(Object):
@ -180,7 +181,7 @@ class Chat(Object):
@staticmethod
def _parse_channel_chat(client, channel: types.Channel) -> "Chat":
peer_id = int("-100" + str(channel.id))
peer_id = utils.get_channel_id(channel.id)
return Chat(
id=peer_id,

View File

@ -21,6 +21,7 @@ import pyrogram
from pyrogram.api import types
from ..object import Object
from ..user_and_chats import Chat
from ...ext import utils
class Dialog(Object):
@ -70,18 +71,9 @@ class Dialog(Object):
@staticmethod
def _parse(client, dialog: types.Dialog, messages, users, chats) -> "Dialog":
chat_id = dialog.peer
if isinstance(chat_id, types.PeerUser):
chat_id = chat_id.user_id
elif isinstance(chat_id, types.PeerChat):
chat_id = -chat_id.chat_id
else:
chat_id = int("-100" + str(chat_id.channel_id))
return Dialog(
chat=Chat._parse_dialog(client, dialog.peer, users, chats),
top_message=messages.get(chat_id),
top_message=messages.get(utils.get_peer_id(dialog.peer)),
unread_messages_count=dialog.unread_count,
unread_mentions_count=dialog.unread_mentions_count,
unread_mark=dialog.unread_mark,