Rename PackedChat type to PeerRef

This commit is contained in:
Lonami Exo 2024-03-17 13:21:26 +01:00
parent 7e413e4ee2
commit 46223bcbcc
20 changed files with 65 additions and 65 deletions

View File

@ -28,7 +28,7 @@ The following types are chat-like:
* An ``'+1 23'`` phone number string. It must be an :class:`str` and start with the plus-sign ``+`` character. * An ``'+1 23'`` phone number string. It must be an :class:`str` and start with the plus-sign ``+`` character.
* An ``123`` integer identifier. It must be an :class:`int` and cannot be negative. * An ``123`` integer identifier. It must be an :class:`int` and cannot be negative.
* An existing :class:`~types.User`, :class:`~types.Group` or :class:`~types.Channel`. * An existing :class:`~types.User`, :class:`~types.Group` or :class:`~types.Channel`.
* A :class:`~types.PackedChat`. * A :class:`~types.PeerRef`.
Previous versions of Telethon referred to this term as "entity" or "entities" instead. Previous versions of Telethon referred to this term as "entity" or "entities" instead.
@ -72,7 +72,7 @@ The Bot API follows a certain convention when it comes to identifiers:
* Chat IDs are negative. * Chat IDs are negative.
* Channel IDs are *also* negative, but are prefixed by ``-100``. * Channel IDs are *also* negative, but are prefixed by ``-100``.
Telethon encourages the use of :class:`~types.PackedChat` instead of naked identifiers. Telethon encourages the use of :class:`~types.PeerRef` instead of naked identifiers.
As a reminder, negative identifiers are not supported in Telethon's chat-like parameters. As a reminder, negative identifiers are not supported in Telethon's chat-like parameters.
If you got an Bot API-style ID from somewhere else, you will need to explicitly say what type it is: If you got an Bot API-style ID from somewhere else, you will need to explicitly say what type it is:
@ -104,7 +104,7 @@ Chats access hash
Users, supergroups and channels all need an :term:`access hash`. Users, supergroups and channels all need an :term:`access hash`.
In Telethon, the :class:`~types.PackedChat` is the recommended way to deal with the identifier-hash pairs. In Telethon, the :class:`~types.PeerRef` is the recommended way to deal with the identifier-hash pairs.
This compact type can be used anywhere a chat is expected. This compact type can be used anywhere a chat is expected.
It's designed to be easy to store and cache in any way your application chooses. It's designed to be easy to store and cache in any way your application chooses.
@ -113,7 +113,7 @@ The same is true for user accounts, although to a lesser extent.
When using just the identifier to refer to a chat, Telethon will attempt to retrieve its hash from its in-memory cache. When using just the identifier to refer to a chat, Telethon will attempt to retrieve its hash from its in-memory cache.
If this fails, an invalid hash will be used. This may or may not make the API call succeed. If this fails, an invalid hash will be used. This may or may not make the API call succeed.
For this reason, it is recommended that you always use :class:`~types.PackedChat` instead. For this reason, it is recommended that you always use :class:`~types.PeerRef` instead.
Remember that an :term:`access hash` is account-bound. Remember that an :term:`access hash` is account-bound.
You cannot obtain an :term:`access hash` in Account-A and use it in Account-B. You cannot obtain an :term:`access hash` in Account-A and use it in Account-B.

View File

@ -96,7 +96,7 @@ and instead favours more standard `HTML elements <https://developer.mozilla.org/
Both markdown and HTML recognise the following special URLs using the ``tg:`` protocol: Both markdown and HTML recognise the following special URLs using the ``tg:`` protocol:
* ``tg://user?id=ab1234cd6789`` for inline mentions. * ``tg://user?id=ab1234cd6789`` for inline mentions.
To make sure the mention works, use :attr:`types.PackedChat.hex`. To make sure the mention works, use :attr:`types.PeerRef.hex`.
You can also use :attr:`types.User.id`, but the mention will fail if the user is not in cache. You can also use :attr:`types.User.id`, but the mention will fail if the user is not in cache.
* ``tg://emoji?id=1234567890`` for custom emoji. * ``tg://emoji?id=1234567890`` for custom emoji.
You must use the document identifier as the value. You must use the document identifier as the value.

View File

@ -443,14 +443,14 @@ This doesn't mean the ``.chat`` or ``.sender`` will have all the information.
Telegram may still choose to send their ``min`` version with only basic details. Telegram may still choose to send their ``min`` version with only basic details.
But it means you don't have to remember 5 different ways of using chats. But it means you don't have to remember 5 different ways of using chats.
To replace the concept of "input chats", v2 introduces :class:`types.PackedChat`. To replace the concept of "input chats", v2 introduces :class:`types.PeerRef`.
A "packed chat" is a chat with *just* enough information that you can use it without relying on Telethon's cache. A "packed chat" is a chat with *just* enough information that you can use it without relying on Telethon's cache.
This is the most efficient way to call methods like :meth:`Client.send_message` too. This is the most efficient way to call methods like :meth:`Client.send_message` too.
The concept of "marked IDs" also no longer exists. The concept of "marked IDs" also no longer exists.
This means v2 no longer supports the ``-`` or ``-100`` prefixes on identifiers. This means v2 no longer supports the ``-`` or ``-100`` prefixes on identifiers.
:tl:`Peer`-wrapping is gone, too. :tl:`Peer`-wrapping is gone, too.
Instead, you're strongly encouraged to use :class:`types.PackedChat` instances. Instead, you're strongly encouraged to use :class:`types.PeerRef` instances.
The concepts of of "entity" or "peer" are unified to simply :term:`chat`. The concepts of of "entity" or "peer" are unified to simply :term:`chat`.
Overall, dealing with users, groups and channels should feel a lot more natural. Overall, dealing with users, groups and channels should feel a lot more natural.
@ -477,7 +477,7 @@ The v1 cache that allowed you to use just chat identifiers to call methods is no
Sessions now only contain crucial information to have a working client. Sessions now only contain crucial information to have a working client.
This includes the server address, authorization key, update state, and some very basic details. This includes the server address, authorization key, update state, and some very basic details.
To work around this, you can use :class:`types.PackedChat`, which is designed to be easy to store. To work around this, you can use :class:`types.PeerRef`, which is designed to be easy to store.
This means your application can choose the best way to deal with them rather than being forced into Telethon's session. This means your application can choose the best way to deal with them rather than being forced into Telethon's session.
.. seealso:: .. seealso::

View File

@ -3,7 +3,7 @@ from __future__ import annotations
import datetime import datetime
from typing import TYPE_CHECKING, Optional, Sequence from typing import TYPE_CHECKING, Optional, Sequence
from ...session import PackedChat from ...session import PeerRef
from ...tl import abcs, functions, types from ...tl import abcs, functions, types
from ..types import ( from ..types import (
AdminRight, AdminRight,
@ -30,7 +30,7 @@ class ParticipantList(AsyncList[Participant]):
super().__init__() super().__init__()
self._client = client self._client = client
self._chat = chat self._chat = chat
self._packed: Optional[PackedChat] = None self._packed: Optional[PeerRef] = None
self._offset = 0 self._offset = 0
self._seen: set[int] = set() self._seen: set[int] = set()

View File

@ -13,7 +13,7 @@ from ...session import (
DataCenter, DataCenter,
MemorySession, MemorySession,
MessageBox, MessageBox,
PackedChat, PeerRef,
Session, Session,
SqliteSession, SqliteSession,
Storage, Storage,
@ -680,7 +680,7 @@ class Client:
""" """
Get the latest basic information about the given chats. Get the latest basic information about the given chats.
This method is most commonly used to turn one or more :class:`~types.PackedChat` into the original :class:`~types.Peer`. This method is most commonly used to turn one or more :class:`~types.PeerRef` into the original :class:`~types.Peer`.
This includes users, groups and broadcast channels. This includes users, groups and broadcast channels.
:param chats: :param chats:
@ -2018,7 +2018,7 @@ class Client:
) -> MessageMap: ) -> MessageMap:
return build_message_map(self, result, peer) return build_message_map(self, result, peer)
async def _resolve_to_packed(self, chat: ChatLike) -> PackedChat: async def _resolve_to_packed(self, chat: ChatLike) -> PeerRef:
return await resolve_to_packed(self, chat) return await resolve_to_packed(self, chat)
def _input_to_peer(self, input: Optional[abcs.InputPeer]) -> Optional[abcs.Peer]: def _input_to_peer(self, input: Optional[abcs.InputPeer]) -> Optional[abcs.Peer]:

View File

@ -4,7 +4,7 @@ import datetime
import sys import sys
from typing import TYPE_CHECKING, Literal, Optional, Self from typing import TYPE_CHECKING, Literal, Optional, Self
from ...session import PackedChat from ...session import PeerRef
from ...tl import abcs, functions, types from ...tl import abcs, functions, types
from ..types import AsyncList, ChatLike, Message, Peer, build_chat_map from ..types import AsyncList, ChatLike, Message, Peer, build_chat_map
from ..types import buttons as btns from ..types import buttons as btns
@ -323,7 +323,7 @@ class CherryPickedList(MessageList):
super().__init__() super().__init__()
self._client = client self._client = client
self._chat = chat self._chat = chat
self._packed: Optional[PackedChat] = None self._packed: Optional[PeerRef] = None
self._ids: list[abcs.InputMessage] = [types.InputMessageId(id=id) for id in ids] self._ids: list[abcs.InputMessage] = [types.InputMessageId(id=id) for id in ids]
async def _fetch_next(self) -> None: async def _fetch_next(self) -> None:

View File

@ -3,7 +3,7 @@ from __future__ import annotations
from typing import TYPE_CHECKING, Optional from typing import TYPE_CHECKING, Optional
from ...mtproto import RpcError from ...mtproto import RpcError
from ...session import PackedChat, PackedType from ...session import PackedType, PeerRef
from ...tl import abcs, functions, types from ...tl import abcs, functions, types
from ..types import ( from ..types import (
AsyncList, AsyncList,
@ -77,7 +77,7 @@ async def resolve_username(self: Client, username: str) -> Peer:
async def get_chats( async def get_chats(
self: Client, chats: list[ChatLike] | tuple[ChatLike, ...] self: Client, chats: list[ChatLike] | tuple[ChatLike, ...]
) -> list[Peer]: ) -> list[Peer]:
packed_chats: list[PackedChat] = [] packed_chats: list[PeerRef] = []
input_users: list[types.InputUser] = [] input_users: list[types.InputUser] = []
input_chats: list[int] = [] input_chats: list[int] = []
input_channels: list[types.InputChannel] = [] input_channels: list[types.InputChannel] = []
@ -122,8 +122,8 @@ async def get_chats(
async def resolve_to_packed( async def resolve_to_packed(
client: Client, chat: ChatLike | abcs.InputPeer | abcs.Peer client: Client, chat: ChatLike | abcs.InputPeer | abcs.Peer
) -> PackedChat: ) -> PeerRef:
if isinstance(chat, PackedChat): if isinstance(chat, PeerRef):
return chat return chat
if isinstance(chat, (User, Group, Channel)): if isinstance(chat, (User, Group, Channel)):
@ -139,7 +139,7 @@ async def resolve_to_packed(
else: else:
ty = PackedType.BROADCAST ty = PackedType.BROADCAST
return PackedChat(ty=ty, id=chat.id, access_hash=0) return PeerRef(ty=ty, id=chat.id, access_hash=0)
if isinstance(chat, abcs.InputPeer): if isinstance(chat, abcs.InputPeer):
if isinstance(chat, types.InputPeerEmpty): if isinstance(chat, types.InputPeerEmpty):
@ -147,25 +147,25 @@ async def resolve_to_packed(
elif isinstance(chat, types.InputPeerSelf): elif isinstance(chat, types.InputPeerSelf):
if not client._session.user: if not client._session.user:
raise ValueError("Cannot resolve chat") raise ValueError("Cannot resolve chat")
return PackedChat( return PeerRef(
ty=PackedType.BOT if client._session.user.bot else PackedType.USER, ty=PackedType.BOT if client._session.user.bot else PackedType.USER,
id=client._chat_hashes.self_id, id=client._chat_hashes.self_id,
access_hash=0, access_hash=0,
) )
elif isinstance(chat, types.InputPeerChat): elif isinstance(chat, types.InputPeerChat):
return PackedChat( return PeerRef(
ty=PackedType.CHAT, ty=PackedType.CHAT,
id=chat.chat_id, id=chat.chat_id,
access_hash=None, access_hash=None,
) )
elif isinstance(chat, types.InputPeerUser): elif isinstance(chat, types.InputPeerUser):
return PackedChat( return PeerRef(
ty=PackedType.USER, ty=PackedType.USER,
id=chat.user_id, id=chat.user_id,
access_hash=chat.access_hash, access_hash=chat.access_hash,
) )
elif isinstance(chat, types.InputPeerChannel): elif isinstance(chat, types.InputPeerChannel):
return PackedChat( return PeerRef(
ty=PackedType.BROADCAST, ty=PackedType.BROADCAST,
id=chat.channel_id, id=chat.channel_id,
access_hash=chat.access_hash, access_hash=chat.access_hash,
@ -182,19 +182,19 @@ async def resolve_to_packed(
if packed is not None: if packed is not None:
return packed return packed
if isinstance(chat, types.PeerUser): if isinstance(chat, types.PeerUser):
return PackedChat( return PeerRef(
ty=PackedType.USER, ty=PackedType.USER,
id=chat.user_id, id=chat.user_id,
access_hash=0, access_hash=0,
) )
elif isinstance(chat, types.PeerChat): elif isinstance(chat, types.PeerChat):
return PackedChat( return PeerRef(
ty=PackedType.CHAT, ty=PackedType.CHAT,
id=chat.chat_id, id=chat.chat_id,
access_hash=0, access_hash=0,
) )
elif isinstance(chat, types.PeerChannel): elif isinstance(chat, types.PeerChannel):
return PackedChat( return PeerRef(
ty=PackedType.BROADCAST, ty=PackedType.BROADCAST,
id=chat.channel_id, id=chat.channel_id,
access_hash=0, access_hash=0,
@ -207,7 +207,7 @@ async def resolve_to_packed(
resolved = await resolve_phone(client, chat) resolved = await resolve_phone(client, chat)
elif chat == "me": elif chat == "me":
if me := client._session.user: if me := client._session.user:
return PackedChat( return PeerRef(
ty=PackedType.BOT if me.bot else PackedType.USER, ty=PackedType.BOT if me.bot else PackedType.USER,
id=me.id, id=me.id,
access_hash=0, access_hash=0,

View File

@ -3,7 +3,7 @@ from __future__ import annotations
import datetime import datetime
from typing import TYPE_CHECKING, Optional, Self from typing import TYPE_CHECKING, Optional, Self
from ...session import PackedChat from ...session import PeerRef
from ...tl import abcs, functions, types from ...tl import abcs, functions, types
from ..parsers import generate_html_message, generate_markdown_message from ..parsers import generate_html_message, generate_markdown_message
from .message import Message, generate_random_id from .message import Message, generate_random_id
@ -158,7 +158,7 @@ class Draft(metaclass=NoPublicConstructor):
reply_to=reply_to, reply_to=reply_to,
) )
async def _packed_chat(self) -> PackedChat: async def _packed_chat(self) -> PeerRef:
packed = None packed = None
if chat := self._chat_map.get(peer_id(self._peer)): if chat := self._chat_map.get(peer_id(self._peer)):
packed = chat.pack() packed = chat.pack()

View File

@ -3,7 +3,7 @@ from __future__ import annotations
import datetime import datetime
from typing import TYPE_CHECKING, Optional, Self, Sequence from typing import TYPE_CHECKING, Optional, Self, Sequence
from ...session import PackedChat from ...session import PeerRef
from ...tl import abcs, types from ...tl import abcs, types
from .admin_right import AdminRight from .admin_right import AdminRight
from .chat_restriction import ChatRestriction from .chat_restriction import ChatRestriction
@ -24,7 +24,7 @@ class Participant(metaclass=NoPublicConstructor):
def __init__( def __init__(
self, self,
client: Client, client: Client,
chat: PackedChat, chat: PeerRef,
participant: ( participant: (
types.ChannelParticipant types.ChannelParticipant
| types.ChannelParticipantSelf | types.ChannelParticipantSelf
@ -47,7 +47,7 @@ class Participant(metaclass=NoPublicConstructor):
def _from_raw_channel( def _from_raw_channel(
cls, cls,
client: Client, client: Client,
chat: PackedChat, chat: PeerRef,
participant: abcs.ChannelParticipant, participant: abcs.ChannelParticipant,
chat_map: dict[int, Peer], chat_map: dict[int, Peer],
) -> Self: ) -> Self:
@ -70,7 +70,7 @@ class Participant(metaclass=NoPublicConstructor):
def _from_raw_chat( def _from_raw_chat(
cls, cls,
client: Client, client: Client,
chat: PackedChat, chat: PeerRef,
participant: abcs.ChatParticipant, participant: abcs.ChatParticipant,
chat_map: dict[int, Peer], chat_map: dict[int, Peer],
) -> Self: ) -> Self:

View File

@ -5,7 +5,7 @@ import sys
from collections import defaultdict from collections import defaultdict
from typing import TYPE_CHECKING, Optional, Sequence from typing import TYPE_CHECKING, Optional, Sequence
from ....session import PackedChat from ....session import PeerRef
from ....tl import abcs, types from ....tl import abcs, types
from .channel import Channel from .channel import Channel
from .group import Group from .group import Group
@ -15,7 +15,7 @@ from .user import User
if TYPE_CHECKING: if TYPE_CHECKING:
from ...client.client import Client from ...client.client import Client
ChatLike = Peer | PackedChat | int | str ChatLike = Peer | PeerRef | int | str
def build_chat_map( def build_chat_map(

View File

@ -1,6 +1,6 @@
from typing import Optional, Self from typing import Optional, Self
from ....session import PackedChat, PackedType from ....session import PackedType, PeerRef
from ....tl import abcs, types from ....tl import abcs, types
from ..meta import NoPublicConstructor from ..meta import NoPublicConstructor
from .peer import Peer from .peer import Peer
@ -50,11 +50,11 @@ class Channel(Peer, metaclass=NoPublicConstructor):
def username(self) -> Optional[str]: def username(self) -> Optional[str]:
return getattr(self._raw, "username", None) return getattr(self._raw, "username", None)
def pack(self) -> Optional[PackedChat]: def pack(self) -> Optional[PeerRef]:
if self._raw.access_hash is None: if self._raw.access_hash is None:
return None return None
else: else:
return PackedChat( return PeerRef(
ty=( ty=(
PackedType.GIGAGROUP PackedType.GIGAGROUP
if getattr(self._raw, "gigagroup", False) if getattr(self._raw, "gigagroup", False)

View File

@ -3,7 +3,7 @@ from __future__ import annotations
import datetime import datetime
from typing import TYPE_CHECKING, Optional, Self, Sequence from typing import TYPE_CHECKING, Optional, Self, Sequence
from ....session import PackedChat, PackedType from ....session import PackedType, PeerRef
from ....tl import abcs, types from ....tl import abcs, types
from ..chat_restriction import ChatRestriction from ..chat_restriction import ChatRestriction
from ..meta import NoPublicConstructor from ..meta import NoPublicConstructor
@ -65,13 +65,13 @@ class Group(Peer, metaclass=NoPublicConstructor):
def username(self) -> Optional[str]: def username(self) -> Optional[str]:
return getattr(self._raw, "username", None) return getattr(self._raw, "username", None)
def pack(self) -> Optional[PackedChat]: def pack(self) -> Optional[PeerRef]:
if isinstance(self._raw, (types.ChatEmpty, types.Chat, types.ChatForbidden)): if isinstance(self._raw, (types.ChatEmpty, types.Chat, types.ChatForbidden)):
return PackedChat(ty=PackedType.CHAT, id=self._raw.id, access_hash=None) return PeerRef(ty=PackedType.CHAT, id=self._raw.id, access_hash=None)
elif self._raw.access_hash is None: elif self._raw.access_hash is None:
return None return None
else: else:
return PackedChat( return PeerRef(
ty=PackedType.MEGAGROUP, ty=PackedType.MEGAGROUP,
id=self._raw.id, id=self._raw.id,
access_hash=self._raw.access_hash, access_hash=self._raw.access_hash,

View File

@ -1,7 +1,7 @@
import abc import abc
from typing import Optional from typing import Optional
from ....session import PackedChat from ....session import PeerRef
class Peer(abc.ABC): class Peer(abc.ABC):
@ -45,7 +45,7 @@ class Peer(abc.ABC):
""" """
@abc.abstractmethod @abc.abstractmethod
def pack(self) -> Optional[PackedChat]: def pack(self) -> Optional[PeerRef]:
""" """
Pack the chat into a compact and reusable object. Pack the chat into a compact and reusable object.

View File

@ -1,6 +1,6 @@
from typing import Optional, Self from typing import Optional, Self
from ....session import PackedChat, PackedType from ....session import PackedType, PeerRef
from ....tl import abcs, types from ....tl import abcs, types
from ..meta import NoPublicConstructor from ..meta import NoPublicConstructor
from .peer import Peer from .peer import Peer
@ -87,11 +87,11 @@ class User(Peer, metaclass=NoPublicConstructor):
def username(self) -> Optional[str]: def username(self) -> Optional[str]:
return self._raw.username return self._raw.username
def pack(self) -> Optional[PackedChat]: def pack(self) -> Optional[PeerRef]:
if self._raw.access_hash is None: if self._raw.access_hash is None:
return None return None
else: else:
return PackedChat( return PeerRef(
ty=PackedType.BOT if self._raw.bot else PackedType.USER, ty=PackedType.BOT if self._raw.bot else PackedType.USER,
id=self._raw.id, id=self._raw.id,
access_hash=self._raw.access_hash, access_hash=self._raw.access_hash,

View File

@ -1,4 +1,4 @@
from .chat import ChatHashCache, PackedChat, PackedType from .chat import ChatHashCache, PackedType, PeerRef
from .message_box import ( from .message_box import (
BOT_CHANNEL_DIFF_LIMIT, BOT_CHANNEL_DIFF_LIMIT,
NO_UPDATES_TIMEOUT, NO_UPDATES_TIMEOUT,
@ -15,7 +15,7 @@ from .storage import MemorySession, SqliteSession, Storage
__all__ = [ __all__ = [
"ChatHashCache", "ChatHashCache",
"PackedChat", "PeerRef",
"PackedType", "PackedType",
"BOT_CHANNEL_DIFF_LIMIT", "BOT_CHANNEL_DIFF_LIMIT",
"NO_UPDATES_TIMEOUT", "NO_UPDATES_TIMEOUT",

View File

@ -1,4 +1,4 @@
from .hash_cache import ChatHashCache from .hash_cache import ChatHashCache
from .peer_ref import PackedChat, PackedType from .peer_ref import PackedType, PeerRef
__all__ = ["ChatHashCache", "PackedChat", "PackedType"] __all__ = ["ChatHashCache", "PeerRef", "PackedType"]

View File

@ -1,7 +1,7 @@
from typing import Any, Optional, Sequence from typing import Any, Optional, Sequence
from ...tl import abcs, types from ...tl import abcs, types
from .peer_ref import PackedChat, PackedType from .peer_ref import PackedType, PeerRef
class ChatHashCache: class ChatHashCache:
@ -21,15 +21,15 @@ class ChatHashCache:
def is_self_bot(self) -> bool: def is_self_bot(self) -> bool:
return self._self_bot return self._self_bot
def set_self_user(self, user: PackedChat) -> None: def set_self_user(self, user: PeerRef) -> None:
assert user.ty in (PackedType.USER, PackedType.BOT) assert user.ty in (PackedType.USER, PackedType.BOT)
self._self_bot = user.ty == PackedType.BOT self._self_bot = user.ty == PackedType.BOT
self._self_id = user.id self._self_id = user.id
def get(self, id: int) -> Optional[PackedChat]: def get(self, id: int) -> Optional[PeerRef]:
if (entry := self._hash_map.get(id)) is not None: if (entry := self._hash_map.get(id)) is not None:
hash, ty = entry hash, ty = entry
return PackedChat(ty, id, hash) return PeerRef(ty, id, hash)
else: else:
return None return None

View File

@ -7,7 +7,7 @@ from ...tl import abcs, types
class PackedType(IntFlag): class PackedType(IntFlag):
""" """
The type of a :class:`PackedChat`. The type of a :class:`PeerRef`.
""" """
# bits: zero, has-access-hash, channel, broadcast, group, chat, user, bot # bits: zero, has-access-hash, channel, broadcast, group, chat, user, bot
@ -19,7 +19,7 @@ class PackedType(IntFlag):
GIGAGROUP = 0b0011_1000 GIGAGROUP = 0b0011_1000
class PackedChat: class PeerRef:
""" """
A compact representation of a :term:`chat`. A compact representation of a :term:`chat`.

View File

@ -23,7 +23,7 @@ from .._impl.client.types import (
User, User,
) )
from .._impl.client.types.buttons import Button, InlineButton from .._impl.client.types.buttons import Button, InlineButton
from .._impl.session import PackedChat, PackedType from .._impl.session import PackedType, PeerRef
__all__ = [ __all__ = [
"AdminRight", "AdminRight",
@ -46,6 +46,6 @@ __all__ = [
"User", "User",
"Button", "Button",
"InlineButton", "InlineButton",
"PackedChat", "PeerRef",
"PackedType", "PackedType",
] ]

View File

@ -1,10 +1,10 @@
from telethon._impl.session import PackedChat, PackedType from telethon._impl.session import PackedType, PeerRef
def test_hash_optional() -> None: def test_hash_optional() -> None:
for ty in PackedType: for ty in PackedType:
pc = PackedChat(ty, 123, 456789) pc = PeerRef(ty, 123, 456789)
assert PackedChat.from_bytes(bytes(pc)) == pc assert PeerRef.from_bytes(bytes(pc)) == pc
pc = PackedChat(ty, 987, None) pc = PeerRef(ty, 987, None)
assert PackedChat.from_bytes(bytes(pc)) == pc assert PeerRef.from_bytes(bytes(pc)) == pc