diff --git a/compiler/api/compiler.py b/compiler/api/compiler.py
index 64e88c9d..0ecc9212 100644
--- a/compiler/api/compiler.py
+++ b/compiler/api/compiler.py
@@ -53,10 +53,10 @@ def get_docstring_arg_type(t: str, is_list: bool = False, is_pyrogram_type: bool
return "``{}``".format(t.lower())
elif t == "true":
return "``bool``"
- elif t == "Object" or t == "X":
- return "Any object from :obj:`pyrogram.api.types`"
+ elif t == "TLObject" or t == "X":
+ return "Any object from :obj:`~pyrogram.api.types`"
elif t == "!X":
- return "Any method from :obj:`pyrogram.api.functions`"
+ return "Any method from :obj:`~pyrogram.api.functions`"
elif t.startswith("Vector"):
return "List of " + get_docstring_arg_type(t.split("<", 1)[1][:-1], True, is_pyrogram_type)
else:
@@ -394,7 +394,7 @@ def start():
)
read_types += "\n "
- read_types += "{} = Object.read(b{}) if flags & (1 << {}) else []\n ".format(
+ read_types += "{} = TLObject.read(b{}) if flags & (1 << {}) else []\n ".format(
arg_name, ", {}".format(sub_type.title()) if sub_type in core_types else "", index
)
else:
@@ -403,7 +403,7 @@ def start():
write_types += "b.write(self.{}.write())\n ".format(arg_name)
read_types += "\n "
- read_types += "{} = Object.read(b) if flags & (1 << {}) else None\n ".format(
+ read_types += "{} = TLObject.read(b) if flags & (1 << {}) else None\n ".format(
arg_name, index
)
else:
@@ -422,7 +422,7 @@ def start():
)
read_types += "\n "
- read_types += "{} = Object.read(b{})\n ".format(
+ read_types += "{} = TLObject.read(b{})\n ".format(
arg_name, ", {}".format(sub_type.title()) if sub_type in core_types else ""
)
else:
@@ -430,7 +430,7 @@ def start():
write_types += "b.write(self.{}.write())\n ".format(arg_name)
read_types += "\n "
- read_types += "{} = Object.read(b)\n ".format(arg_name)
+ read_types += "{} = TLObject.read(b)\n ".format(arg_name)
if c.docs:
description = c.docs.split("|")[0].split("ยง")[1]
diff --git a/compiler/api/template/mtproto.txt b/compiler/api/template/mtproto.txt
index c63525d6..d7d3c7b7 100644
--- a/compiler/api/template/mtproto.txt
+++ b/compiler/api/template/mtproto.txt
@@ -5,7 +5,7 @@ from io import BytesIO
from pyrogram.api.core import *
-class {class_name}(Object):
+class {class_name}(TLObject):
"""{docstring_args}
"""
diff --git a/pyrogram/api/__init__.py b/pyrogram/api/__init__.py
index e57f0661..8d7831ff 100644
--- a/pyrogram/api/__init__.py
+++ b/pyrogram/api/__init__.py
@@ -19,8 +19,8 @@
from importlib import import_module
from .all import objects
-from .core.object import Object
+from .core.tl_object import TLObject
for k, v in objects.items():
path, name = v.rsplit(".", 1)
- Object.all[k] = getattr(import_module(path), name)
+ TLObject.all[k] = getattr(import_module(path), name)
diff --git a/pyrogram/api/core/__init__.py b/pyrogram/api/core/__init__.py
index bf596446..f27a26a5 100644
--- a/pyrogram/api/core/__init__.py
+++ b/pyrogram/api/core/__init__.py
@@ -22,7 +22,7 @@ from .gzip_packed import GzipPacked
from .list import List
from .message import Message
from .msg_container import MsgContainer
-from .object import Object
+from .tl_object import TLObject
from .primitives import (
Bool, BoolTrue, BoolFalse, Bytes, Double,
Int, Long, Int128, Int256, Null, String, Vector
diff --git a/pyrogram/api/core/future_salt.py b/pyrogram/api/core/future_salt.py
index c4ccea3d..699a416f 100644
--- a/pyrogram/api/core/future_salt.py
+++ b/pyrogram/api/core/future_salt.py
@@ -18,11 +18,11 @@
from io import BytesIO
-from .object import Object
+from .tl_object import TLObject
from .primitives import Int, Long
-class FutureSalt(Object):
+class FutureSalt(TLObject):
ID = 0x0949d9dc
__slots__ = ["valid_since", "valid_until", "salt"]
diff --git a/pyrogram/api/core/future_salts.py b/pyrogram/api/core/future_salts.py
index 91ee7b51..c749c569 100644
--- a/pyrogram/api/core/future_salts.py
+++ b/pyrogram/api/core/future_salts.py
@@ -19,11 +19,11 @@
from io import BytesIO
from . import FutureSalt
-from .object import Object
+from .tl_object import TLObject
from .primitives import Int, Long
-class FutureSalts(Object):
+class FutureSalts(TLObject):
ID = 0xae500895
__slots__ = ["req_msg_id", "now", "salts"]
diff --git a/pyrogram/api/core/gzip_packed.py b/pyrogram/api/core/gzip_packed.py
index 135c36bf..4b212184 100644
--- a/pyrogram/api/core/gzip_packed.py
+++ b/pyrogram/api/core/gzip_packed.py
@@ -19,24 +19,24 @@
from gzip import compress, decompress
from io import BytesIO
-from .object import Object
+from .tl_object import TLObject
from .primitives import Int, Bytes
-class GzipPacked(Object):
+class GzipPacked(TLObject):
ID = 0x3072cfa1
__slots__ = ["packed_data"]
QUALNAME = "GzipPacked"
- def __init__(self, packed_data: Object):
+ def __init__(self, packed_data: TLObject):
self.packed_data = packed_data
@staticmethod
def read(b: BytesIO, *args) -> "GzipPacked":
# Return the Object itself instead of a GzipPacked wrapping it
- return Object.read(
+ return TLObject.read(
BytesIO(
decompress(
Bytes.read(b)
diff --git a/pyrogram/api/core/list.py b/pyrogram/api/core/list.py
index 922ec64d..4b309a6d 100644
--- a/pyrogram/api/core/list.py
+++ b/pyrogram/api/core/list.py
@@ -16,13 +16,13 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see .
-from .object import Object
+from .tl_object import TLObject
-class List(list, Object):
+class List(list, TLObject):
__slots__ = []
def __repr__(self):
return "pyrogram.api.core.List([{}])".format(
- ",".join(Object.__repr__(i) for i in self)
+ ",".join(TLObject.__repr__(i) for i in self)
)
diff --git a/pyrogram/api/core/message.py b/pyrogram/api/core/message.py
index 5b2e5b64..db123db3 100644
--- a/pyrogram/api/core/message.py
+++ b/pyrogram/api/core/message.py
@@ -18,18 +18,18 @@
from io import BytesIO
-from .object import Object
+from .tl_object import TLObject
from .primitives import Int, Long
-class Message(Object):
+class Message(TLObject):
ID = 0x5bb8e511 # hex(crc32(b"message msg_id:long seqno:int bytes:int body:Object = Message"))
__slots__ = ["msg_id", "seq_no", "length", "body"]
QUALNAME = "Message"
- def __init__(self, body: Object, msg_id: int, seq_no: int, length: int):
+ def __init__(self, body: TLObject, msg_id: int, seq_no: int, length: int):
self.msg_id = msg_id
self.seq_no = seq_no
self.length = length
@@ -42,7 +42,7 @@ class Message(Object):
length = Int.read(b)
body = b.read(length)
- return Message(Object.read(BytesIO(body)), msg_id, seq_no, length)
+ return Message(TLObject.read(BytesIO(body)), msg_id, seq_no, length)
def write(self) -> bytes:
b = BytesIO()
diff --git a/pyrogram/api/core/msg_container.py b/pyrogram/api/core/msg_container.py
index bfc41333..7a17087e 100644
--- a/pyrogram/api/core/msg_container.py
+++ b/pyrogram/api/core/msg_container.py
@@ -19,11 +19,11 @@
from io import BytesIO
from .message import Message
-from .object import Object
+from .tl_object import TLObject
from .primitives import Int
-class MsgContainer(Object):
+class MsgContainer(TLObject):
ID = 0x73f1f8dc
__slots__ = ["messages"]
diff --git a/pyrogram/api/core/primitives/bool.py b/pyrogram/api/core/primitives/bool.py
index 117ee7a4..0d3732e0 100644
--- a/pyrogram/api/core/primitives/bool.py
+++ b/pyrogram/api/core/primitives/bool.py
@@ -18,10 +18,10 @@
from io import BytesIO
-from ..object import Object
+from ..tl_object import TLObject
-class BoolFalse(Object):
+class BoolFalse(TLObject):
ID = 0xbc799737
value = False
@@ -38,7 +38,7 @@ class BoolTrue(BoolFalse):
value = True
-class Bool(Object):
+class Bool(TLObject):
@classmethod
def read(cls, b: BytesIO) -> bool:
return int.from_bytes(b.read(4), "little") == BoolTrue.ID
diff --git a/pyrogram/api/core/primitives/bytes.py b/pyrogram/api/core/primitives/bytes.py
index 8030b598..f511fef3 100644
--- a/pyrogram/api/core/primitives/bytes.py
+++ b/pyrogram/api/core/primitives/bytes.py
@@ -18,10 +18,10 @@
from io import BytesIO
-from ..object import Object
+from ..tl_object import TLObject
-class Bytes(Object):
+class Bytes(TLObject):
@staticmethod
def read(b: BytesIO, *args) -> bytes:
length = int.from_bytes(b.read(1), "little")
diff --git a/pyrogram/api/core/primitives/double.py b/pyrogram/api/core/primitives/double.py
index 3dcaa461..067d08bd 100644
--- a/pyrogram/api/core/primitives/double.py
+++ b/pyrogram/api/core/primitives/double.py
@@ -19,10 +19,10 @@
from io import BytesIO
from struct import unpack, pack
-from ..object import Object
+from ..tl_object import TLObject
-class Double(Object):
+class Double(TLObject):
@staticmethod
def read(b: BytesIO, *args) -> float:
return unpack("d", b.read(8))[0]
diff --git a/pyrogram/api/core/primitives/int.py b/pyrogram/api/core/primitives/int.py
index 7833a610..ea43983c 100644
--- a/pyrogram/api/core/primitives/int.py
+++ b/pyrogram/api/core/primitives/int.py
@@ -18,10 +18,10 @@
from io import BytesIO
-from ..object import Object
+from ..tl_object import TLObject
-class Int(Object):
+class Int(TLObject):
SIZE = 4
@classmethod
diff --git a/pyrogram/api/core/primitives/null.py b/pyrogram/api/core/primitives/null.py
index d2d3b1c0..ffddea94 100644
--- a/pyrogram/api/core/primitives/null.py
+++ b/pyrogram/api/core/primitives/null.py
@@ -18,10 +18,10 @@
from io import BytesIO
-from ..object import Object
+from ..tl_object import TLObject
-class Null(Object):
+class Null(TLObject):
ID = 0x56730bcc
@staticmethod
diff --git a/pyrogram/api/core/primitives/vector.py b/pyrogram/api/core/primitives/vector.py
index 720486f2..641b33ef 100644
--- a/pyrogram/api/core/primitives/vector.py
+++ b/pyrogram/api/core/primitives/vector.py
@@ -20,31 +20,31 @@ from io import BytesIO
from . import Int
from ..list import List
-from ..object import Object
+from ..tl_object import TLObject
-class Vector(Object):
+class Vector(TLObject):
ID = 0x1cb5c415
# Method added to handle the special case when a query returns a bare Vector (of Ints);
# i.e., RpcResult body starts with 0x1cb5c415 (Vector Id) - e.g., messages.GetMessagesViews.
@staticmethod
- def _read(b: BytesIO) -> Object or int:
+ def _read(b: BytesIO) -> TLObject or int:
try:
- return Object.read(b)
+ return TLObject.read(b)
except KeyError:
b.seek(-4, 1)
return Int.read(b)
@staticmethod
- def read(b: BytesIO, t: Object = None) -> list:
+ def read(b: BytesIO, t: TLObject = None) -> list:
return List(
t.read(b) if t
else Vector._read(b)
for _ in range(Int.read(b))
)
- def __new__(cls, value: list, t: Object = None) -> bytes:
+ def __new__(cls, value: list, t: TLObject = None) -> bytes:
return b"".join(
[Int(cls.ID, False), Int(len(value))]
+ [
diff --git a/pyrogram/api/core/object.py b/pyrogram/api/core/tl_object.py
similarity index 86%
rename from pyrogram/api/core/object.py
rename to pyrogram/api/core/tl_object.py
index 9d1a4852..4b951404 100644
--- a/pyrogram/api/core/object.py
+++ b/pyrogram/api/core/tl_object.py
@@ -21,7 +21,7 @@ from io import BytesIO
from json import dumps
-class Object:
+class TLObject:
all = {}
__slots__ = []
@@ -30,13 +30,13 @@ class Object:
@staticmethod
def read(b: BytesIO, *args): # TODO: Rename b -> data
- return Object.all[int.from_bytes(b.read(4), "little")].read(b, *args)
+ return TLObject.all[int.from_bytes(b.read(4), "little")].read(b, *args)
def write(self, *args) -> bytes:
pass
@staticmethod
- def default(obj: "Object"):
+ def default(obj: "TLObject"):
if isinstance(obj, bytes):
return repr(obj)
@@ -50,7 +50,7 @@ class Object:
)
def __str__(self) -> str:
- return dumps(self, indent=4, default=Object.default, ensure_ascii=False)
+ return dumps(self, indent=4, default=TLObject.default, ensure_ascii=False)
def __repr__(self) -> str:
return "pyrogram.api.{}({})".format(
@@ -62,7 +62,7 @@ class Object:
)
)
- def __eq__(self, other: "Object") -> bool:
+ def __eq__(self, other: "TLObject") -> bool:
for attr in self.__slots__:
try:
if getattr(self, attr) != getattr(other, attr):
@@ -77,3 +77,6 @@ class Object:
def __getitem__(self, item):
return getattr(self, item)
+
+ def __setitem__(self, key, value):
+ setattr(self, key, value)
diff --git a/pyrogram/client/client.py b/pyrogram/client/client.py
index 2ba6b8fa..08a3072e 100644
--- a/pyrogram/client/client.py
+++ b/pyrogram/client/client.py
@@ -37,7 +37,7 @@ from threading import Thread
from typing import Union, List
from pyrogram.api import functions, types
-from pyrogram.api.core import Object
+from pyrogram.api.core import TLObject
from pyrogram.client.handlers import DisconnectHandler
from pyrogram.client.handlers.handler import Handler
from pyrogram.client.methods.password.utils import compute_check
@@ -998,7 +998,7 @@ class Client(Methods, BaseClient):
log.debug("{} stopped".format(name))
- def send(self, data: Object, retries: int = Session.MAX_RETRIES, timeout: float = Session.WAIT_TIMEOUT):
+ def send(self, data: TLObject, retries: int = Session.MAX_RETRIES, timeout: float = Session.WAIT_TIMEOUT):
"""Send raw Telegram queries.
This method makes it possible to manually call every single Telegram API method in a low-level manner.
diff --git a/pyrogram/session/auth.py b/pyrogram/session/auth.py
index 89e5b61f..fb6e7ca3 100644
--- a/pyrogram/session/auth.py
+++ b/pyrogram/session/auth.py
@@ -23,7 +23,7 @@ from io import BytesIO
from os import urandom
from pyrogram.api import functions, types
-from pyrogram.api.core import Object, Long, Int
+from pyrogram.api.core import TLObject, Long, Int
from pyrogram.connection import Connection
from pyrogram.crypto import AES, RSA, Prime
from .internals import MsgId
@@ -43,7 +43,7 @@ class Auth:
self.connection = None
@staticmethod
- def pack(data: Object) -> bytes:
+ def pack(data: TLObject) -> bytes:
return (
bytes(8)
+ Long(MsgId())
@@ -54,9 +54,9 @@ class Auth:
@staticmethod
def unpack(b: BytesIO):
b.seek(20) # Skip auth_key_id (8), message_id (8) and message_length (4)
- return Object.read(b)
+ return TLObject.read(b)
- def send(self, data: Object):
+ def send(self, data: TLObject):
data = self.pack(data)
self.connection.send(data)
response = BytesIO(self.connection.recv())
@@ -158,7 +158,7 @@ class Auth:
answer_with_hash = AES.ige256_decrypt(encrypted_answer, tmp_aes_key, tmp_aes_iv)
answer = answer_with_hash[20:]
- server_dh_inner_data = Object.read(BytesIO(answer))
+ server_dh_inner_data = TLObject.read(BytesIO(answer))
log.debug("Done decrypting answer")
diff --git a/pyrogram/session/internals/msg_factory.py b/pyrogram/session/internals/msg_factory.py
index 7d922ec3..2b833ce8 100644
--- a/pyrogram/session/internals/msg_factory.py
+++ b/pyrogram/session/internals/msg_factory.py
@@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see .
-from pyrogram.api.core import Message, MsgContainer, Object
+from pyrogram.api.core import Message, MsgContainer, TLObject
from pyrogram.api.functions import Ping
from pyrogram.api.types import MsgsAck, HttpWait
from .msg_id import MsgId
@@ -29,7 +29,7 @@ class MsgFactory:
def __init__(self):
self.seq_no = SeqNo()
- def __call__(self, body: Object) -> Message:
+ def __call__(self, body: TLObject) -> Message:
return Message(
body,
MsgId(),
diff --git a/pyrogram/session/session.py b/pyrogram/session/session.py
index e4260be4..8ef5570c 100644
--- a/pyrogram/session/session.py
+++ b/pyrogram/session/session.py
@@ -30,7 +30,7 @@ import pyrogram
from pyrogram import __copyright__, __license__, __version__
from pyrogram.api import functions, types, core
from pyrogram.api.all import layer
-from pyrogram.api.core import Message, Object, MsgContainer, Long, FutureSalt, Int
+from pyrogram.api.core import Message, TLObject, MsgContainer, Long, FutureSalt, Int
from pyrogram.connection import Connection
from pyrogram.crypto import AES, KDF
from pyrogram.errors import RPCError, InternalServerError, AuthKeyDuplicated
@@ -391,7 +391,7 @@ class Session:
log.debug("RecvThread stopped")
- def _send(self, data: Object, wait_response: bool = True, timeout: float = WAIT_TIMEOUT):
+ def _send(self, data: TLObject, wait_response: bool = True, timeout: float = WAIT_TIMEOUT):
message = self.msg_factory(data)
msg_id = message.msg_id
@@ -422,7 +422,7 @@ class Session:
else:
return result
- def send(self, data: Object, retries: int = MAX_RETRIES, timeout: float = WAIT_TIMEOUT):
+ def send(self, data: TLObject, retries: int = MAX_RETRIES, timeout: float = WAIT_TIMEOUT):
self.is_connected.wait(self.WAIT_TIMEOUT)
try: