mirror of
https://github.com/pyrogram/pyrogram
synced 2025-08-29 13:27:47 +00:00
Merge pull request #230 from pyrogram/__slots__
Make use of __slots__ for efficiency
This commit is contained in:
commit
bdb03957db
@ -287,9 +287,11 @@ def start():
|
||||
|
||||
sorted_args = sort_args(c.args)
|
||||
|
||||
arguments = ", " + ", ".join(
|
||||
[get_argument_type(i) for i in sorted_args if i != ("flags", "#")]
|
||||
) if c.args else ""
|
||||
arguments = (
|
||||
", "
|
||||
+ ("*, " if c.args else "")
|
||||
+ (", ".join([get_argument_type(i) for i in sorted_args if i != ("flags", "#")]) if c.args else "")
|
||||
)
|
||||
|
||||
fields = "\n ".join(
|
||||
["self.{0} = {0} # {1}".format(i[0], i[1]) for i in c.args if i != ("flags", "#")]
|
||||
@ -456,7 +458,11 @@ def start():
|
||||
fields=fields,
|
||||
read_types=read_types,
|
||||
write_types=write_types,
|
||||
return_arguments=", ".join([i[0] for i in sorted_args if i != ("flags", "#")])
|
||||
return_arguments=", ".join(
|
||||
["{0}={0}".format(i[0]) for i in sorted_args if i != ("flags", "#")]
|
||||
),
|
||||
slots=", ".join(['"{}"'.format(i[0]) for i in sorted_args if i != ("flags", "#")]),
|
||||
qualname="{}{}".format("{}.".format(c.namespace) if c.namespace else "", c.name)
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -9,7 +9,10 @@ class {class_name}(Object):
|
||||
"""{docstring_args}
|
||||
"""
|
||||
|
||||
__slots__ = [{slots}]
|
||||
|
||||
ID = {object_id}
|
||||
QUALNAME = "{qualname}"
|
||||
|
||||
def __init__(self{arguments}):
|
||||
{fields}
|
||||
|
@ -19,14 +19,16 @@
|
||||
from collections import OrderedDict
|
||||
from datetime import datetime
|
||||
from io import BytesIO
|
||||
from json import JSONEncoder, dumps
|
||||
|
||||
from ..all import objects
|
||||
from json import dumps
|
||||
|
||||
|
||||
class Object:
|
||||
all = {}
|
||||
|
||||
__slots__ = []
|
||||
|
||||
QUALNAME = "Base"
|
||||
|
||||
@staticmethod
|
||||
def read(b: BytesIO, *args):
|
||||
return Object.all[int.from_bytes(b.read(4), "little")].read(b, *args)
|
||||
@ -35,7 +37,7 @@ class Object:
|
||||
pass
|
||||
|
||||
def __str__(self) -> str:
|
||||
return dumps(self, cls=Encoder, indent=4)
|
||||
return dumps(self, indent=4, default=default, ensure_ascii=False)
|
||||
|
||||
def __bool__(self) -> bool:
|
||||
return True
|
||||
@ -62,29 +64,18 @@ def remove_none(obj):
|
||||
return obj
|
||||
|
||||
|
||||
class Encoder(JSONEncoder):
|
||||
def default(self, o: Object):
|
||||
try:
|
||||
content = o.__dict__
|
||||
except AttributeError:
|
||||
if isinstance(o, datetime):
|
||||
return o.strftime("%d-%b-%Y %H:%M:%S")
|
||||
else:
|
||||
return repr(o)
|
||||
def default(o: "Object"):
|
||||
try:
|
||||
content = {i: getattr(o, i) for i in o.__slots__}
|
||||
|
||||
name = o.__class__.__name__
|
||||
o = objects.get(getattr(o, "ID", None), None)
|
||||
|
||||
if o is not None:
|
||||
if o.startswith("pyrogram.client"):
|
||||
r = remove_none(OrderedDict([("_", "pyrogram:" + name)] + [i for i in content.items()]))
|
||||
r.pop("_client", None)
|
||||
|
||||
return r
|
||||
else:
|
||||
return OrderedDict(
|
||||
[("_", o.replace("pyrogram.api.types.", "telegram:"))]
|
||||
+ [i for i in content.items()]
|
||||
)
|
||||
return remove_none(
|
||||
OrderedDict(
|
||||
[("_", o.QUALNAME)]
|
||||
+ [i for i in content.items()]
|
||||
)
|
||||
)
|
||||
except AttributeError:
|
||||
if isinstance(o, datetime):
|
||||
return o.strftime("%d-%b-%Y %H:%M:%S")
|
||||
else:
|
||||
return None
|
||||
return repr(o)
|
||||
|
@ -627,9 +627,9 @@ class Client(Methods, BaseClient):
|
||||
try:
|
||||
r = self.send(
|
||||
functions.auth.SignIn(
|
||||
self.phone_number,
|
||||
phone_code_hash,
|
||||
self.phone_code
|
||||
phone_number=self.phone_number,
|
||||
phone_code_hash=phone_code_hash,
|
||||
phone_code=self.phone_code
|
||||
)
|
||||
)
|
||||
except PhoneNumberUnoccupied:
|
||||
@ -640,11 +640,11 @@ class Client(Methods, BaseClient):
|
||||
try:
|
||||
r = self.send(
|
||||
functions.auth.SignUp(
|
||||
self.phone_number,
|
||||
phone_code_hash,
|
||||
self.phone_code,
|
||||
self.first_name,
|
||||
self.last_name
|
||||
phone_number=self.phone_number,
|
||||
phone_code_hash=phone_code_hash,
|
||||
phone_code=self.phone_code,
|
||||
first_name=self.first_name,
|
||||
last_name=self.last_name
|
||||
)
|
||||
)
|
||||
except PhoneNumberOccupied:
|
||||
@ -738,7 +738,11 @@ class Client(Methods, BaseClient):
|
||||
break
|
||||
|
||||
if terms_of_service:
|
||||
assert self.send(functions.help.AcceptTermsOfService(terms_of_service.id))
|
||||
assert self.send(
|
||||
functions.help.AcceptTermsOfService(
|
||||
id=terms_of_service.id
|
||||
)
|
||||
)
|
||||
|
||||
self.password = None
|
||||
self.user_id = r.user.id
|
||||
@ -1036,10 +1040,10 @@ class Client(Methods, BaseClient):
|
||||
raise ConnectionError("Client has not been started")
|
||||
|
||||
if self.no_updates:
|
||||
data = functions.InvokeWithoutUpdates(data)
|
||||
data = functions.InvokeWithoutUpdates(query=data)
|
||||
|
||||
if self.takeout_id:
|
||||
data = functions.InvokeWithTakeout(self.takeout_id, data)
|
||||
data = functions.InvokeWithTakeout(takeout_id=self.takeout_id, query=data)
|
||||
|
||||
r = self.session.send(data, retries, timeout)
|
||||
|
||||
@ -1353,7 +1357,7 @@ class Client(Methods, BaseClient):
|
||||
self.fetch_peers(
|
||||
self.send(
|
||||
functions.users.GetUsers(
|
||||
id=[types.InputUser(peer_id, 0)]
|
||||
id=[types.InputUser(user_id=peer_id, access_hash=0)]
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -1361,7 +1365,7 @@ class Client(Methods, BaseClient):
|
||||
if str(peer_id).startswith("-100"):
|
||||
self.send(
|
||||
functions.channels.GetChannels(
|
||||
id=[types.InputChannel(int(str(peer_id)[4:]), 0)]
|
||||
id=[types.InputChannel(channel_id=int(str(peer_id)[4:]), access_hash=0)]
|
||||
)
|
||||
)
|
||||
else:
|
||||
@ -1668,8 +1672,8 @@ class Client(Methods, BaseClient):
|
||||
|
||||
hashes = session.send(
|
||||
functions.upload.GetCdnFileHashes(
|
||||
r.file_token,
|
||||
offset
|
||||
file_token=r.file_token,
|
||||
offset=offset
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -67,10 +67,10 @@ def get_peer_id(input_peer) -> int:
|
||||
|
||||
def get_input_peer(peer_id: int, access_hash: int):
|
||||
return (
|
||||
types.InputPeerUser(peer_id, access_hash) if peer_id > 0
|
||||
else types.InputPeerChannel(int(str(peer_id)[4:]), access_hash)
|
||||
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(-peer_id)
|
||||
else types.InputPeerChat(chat_id=-peer_id)
|
||||
)
|
||||
|
||||
|
||||
|
@ -45,7 +45,7 @@ class ExportChatInviteLink(BaseClient):
|
||||
if isinstance(peer, types.InputPeerChat):
|
||||
return self.send(
|
||||
functions.messages.ExportChatInvite(
|
||||
chat_id=peer.chat_id
|
||||
peer=peer.chat_id
|
||||
)
|
||||
).link
|
||||
elif isinstance(peer, types.InputPeerChannel):
|
||||
|
@ -67,10 +67,10 @@ class GetChat(BaseClient):
|
||||
peer = self.resolve_peer(chat_id)
|
||||
|
||||
if isinstance(peer, types.InputPeerChannel):
|
||||
r = self.send(functions.channels.GetFullChannel(peer))
|
||||
r = self.send(functions.channels.GetFullChannel(channel=peer))
|
||||
elif isinstance(peer, (types.InputPeerUser, types.InputPeerSelf)):
|
||||
r = self.send(functions.users.GetFullUser(peer))
|
||||
r = self.send(functions.users.GetFullUser(id=peer))
|
||||
else:
|
||||
r = self.send(functions.messages.GetFullChat(peer.chat_id))
|
||||
r = self.send(functions.messages.GetFullChat(chat_id=peer.chat_id))
|
||||
|
||||
return pyrogram.Chat._parse_full(self, r)
|
||||
|
@ -92,7 +92,7 @@ class GetChatMembers(BaseClient):
|
||||
self,
|
||||
self.send(
|
||||
functions.messages.GetFullChat(
|
||||
peer.chat_id
|
||||
chat_id=peer.chat_id
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -39,7 +39,7 @@ class GetContacts(BaseClient):
|
||||
"""
|
||||
while True:
|
||||
try:
|
||||
contacts = self.send(functions.contacts.GetContacts(0))
|
||||
contacts = self.send(functions.contacts.GetContacts(hash=0))
|
||||
except FloodWait as e:
|
||||
log.warning("get_contacts flood: waiting {} seconds".format(e.x))
|
||||
time.sleep(e.x)
|
||||
|
@ -131,7 +131,9 @@ class EditMessageMedia(BaseClient):
|
||||
w=media.width,
|
||||
h=media.height
|
||||
),
|
||||
types.DocumentAttributeFilename(os.path.basename(media.media))
|
||||
types.DocumentAttributeFilename(
|
||||
file_name=os.path.basename(media.media)
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
@ -187,7 +189,9 @@ class EditMessageMedia(BaseClient):
|
||||
performer=media.performer,
|
||||
title=media.title
|
||||
),
|
||||
types.DocumentAttributeFilename(os.path.basename(media.media))
|
||||
types.DocumentAttributeFilename(
|
||||
file_name=os.path.basename(media.media)
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
@ -244,7 +248,9 @@ class EditMessageMedia(BaseClient):
|
||||
w=media.width,
|
||||
h=media.height
|
||||
),
|
||||
types.DocumentAttributeFilename(os.path.basename(media.media)),
|
||||
types.DocumentAttributeFilename(
|
||||
file_name=os.path.basename(media.media)
|
||||
),
|
||||
types.DocumentAttributeAnimated()
|
||||
]
|
||||
)
|
||||
@ -296,7 +302,9 @@ class EditMessageMedia(BaseClient):
|
||||
thumb=None if media.thumb is None else self.save_file(media.thumb),
|
||||
file=self.save_file(media.media),
|
||||
attributes=[
|
||||
types.DocumentAttributeFilename(os.path.basename(media.media))
|
||||
types.DocumentAttributeFilename(
|
||||
file_name=os.path.basename(media.media)
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
|
@ -76,7 +76,7 @@ class GetMessages(BaseClient):
|
||||
|
||||
is_iterable = not isinstance(ids, int)
|
||||
ids = list(ids) if is_iterable else [ids]
|
||||
ids = [ids_type(i) for i in ids]
|
||||
ids = [ids_type(id=i) for i in ids]
|
||||
|
||||
if isinstance(peer, types.InputPeerChannel):
|
||||
rpc = functions.channels.GetMessages(channel=peer, id=ids)
|
||||
|
@ -141,7 +141,7 @@ class SendAnimation(BaseClient):
|
||||
w=width,
|
||||
h=height
|
||||
),
|
||||
types.DocumentAttributeFilename(os.path.basename(animation)),
|
||||
types.DocumentAttributeFilename(file_name=os.path.basename(animation)),
|
||||
types.DocumentAttributeAnimated()
|
||||
]
|
||||
)
|
||||
|
@ -142,7 +142,7 @@ class SendAudio(BaseClient):
|
||||
performer=performer,
|
||||
title=title
|
||||
),
|
||||
types.DocumentAttributeFilename(os.path.basename(audio))
|
||||
types.DocumentAttributeFilename(file_name=os.path.basename(audio))
|
||||
]
|
||||
)
|
||||
elif audio.startswith("http"):
|
||||
|
@ -123,7 +123,7 @@ class SendDocument(BaseClient):
|
||||
file=file,
|
||||
thumb=thumb,
|
||||
attributes=[
|
||||
types.DocumentAttributeFilename(os.path.basename(document))
|
||||
types.DocumentAttributeFilename(file_name=os.path.basename(document))
|
||||
]
|
||||
)
|
||||
elif document.startswith("http"):
|
||||
|
@ -69,9 +69,9 @@ class SendLocation(BaseClient):
|
||||
functions.messages.SendMedia(
|
||||
peer=self.resolve_peer(chat_id),
|
||||
media=types.InputMediaGeoPoint(
|
||||
types.InputGeoPoint(
|
||||
latitude,
|
||||
longitude
|
||||
geo_point=types.InputGeoPoint(
|
||||
lat=latitude,
|
||||
long=longitude
|
||||
)
|
||||
),
|
||||
message="",
|
||||
|
@ -137,7 +137,7 @@ class SendMediaGroup(BaseClient):
|
||||
w=i.width,
|
||||
h=i.height
|
||||
),
|
||||
types.DocumentAttributeFilename(os.path.basename(i.media))
|
||||
types.DocumentAttributeFilename(file_name=os.path.basename(i.media))
|
||||
]
|
||||
)
|
||||
)
|
||||
|
@ -103,7 +103,7 @@ class SendSticker(BaseClient):
|
||||
mime_type="image/webp",
|
||||
file=file,
|
||||
attributes=[
|
||||
types.DocumentAttributeFilename(os.path.basename(sticker))
|
||||
types.DocumentAttributeFilename(file_name=os.path.basename(sticker))
|
||||
]
|
||||
)
|
||||
elif sticker.startswith("http"):
|
||||
|
@ -145,7 +145,7 @@ class SendVideo(BaseClient):
|
||||
w=width,
|
||||
h=height
|
||||
),
|
||||
types.DocumentAttributeFilename(os.path.basename(video))
|
||||
types.DocumentAttributeFilename(file_name=os.path.basename(video))
|
||||
]
|
||||
)
|
||||
elif video.startswith("http"):
|
||||
|
@ -101,4 +101,4 @@ def compute_check(r: types.account.Password, password: str) -> types.InputCheckP
|
||||
+ K_bytes
|
||||
)
|
||||
|
||||
return types.InputCheckPasswordSRP(srp_id, A_bytes, M1_bytes)
|
||||
return types.InputCheckPasswordSRP(srp_id=srp_id, A=A_bytes, M1=M1_bytes)
|
||||
|
@ -35,7 +35,7 @@ class GetMe(BaseClient):
|
||||
self,
|
||||
self.send(
|
||||
functions.users.GetFullUser(
|
||||
types.InputPeerSelf()
|
||||
id=types.InputPeerSelf()
|
||||
)
|
||||
).user
|
||||
)
|
||||
|
@ -43,7 +43,7 @@ class SetUserProfilePhoto(BaseClient):
|
||||
return bool(
|
||||
self.send(
|
||||
functions.photos.UploadProfilePhoto(
|
||||
self.save_file(photo)
|
||||
file=self.save_file(photo)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -55,20 +55,20 @@ class HTML:
|
||||
input_user = self.peers_by_id.get(user_id, None)
|
||||
|
||||
entity = (
|
||||
Mention(start, len(body), input_user)
|
||||
if input_user else MentionInvalid(start, len(body), user_id)
|
||||
Mention(offset=start, length=len(body), user_id=input_user)
|
||||
if input_user else MentionInvalid(offset=start, length=len(body), user_id=user_id)
|
||||
)
|
||||
else:
|
||||
entity = Url(start, len(body), url)
|
||||
entity = Url(offset=start, length=len(body), url=url)
|
||||
else:
|
||||
if style == "b" or style == "strong":
|
||||
entity = Bold(start, len(body))
|
||||
entity = Bold(offset=start, length=len(body))
|
||||
elif style == "i" or style == "em":
|
||||
entity = Italic(start, len(body))
|
||||
entity = Italic(offset=start, length=len(body))
|
||||
elif style == "code":
|
||||
entity = Code(start, len(body))
|
||||
entity = Code(offset=start, length=len(body))
|
||||
elif style == "pre":
|
||||
entity = Pre(start, len(body), "")
|
||||
entity = Pre(offset=start, length=len(body), language="")
|
||||
else:
|
||||
continue
|
||||
|
||||
|
@ -72,24 +72,24 @@ class Markdown:
|
||||
input_user = self.peers_by_id.get(user_id, None)
|
||||
|
||||
entity = (
|
||||
Mention(start, len(text), input_user)
|
||||
Mention(offset=start, length=len(text), user_id=input_user)
|
||||
if input_user
|
||||
else MentionInvalid(start, len(text), user_id)
|
||||
else MentionInvalid(offset=start, length=len(text), user_id=user_id)
|
||||
)
|
||||
else:
|
||||
entity = Url(start, len(text), url)
|
||||
entity = Url(offset=start, length=len(text), url=url)
|
||||
|
||||
body = text
|
||||
offset += len(url) + 4
|
||||
else:
|
||||
if style == self.BOLD_DELIMITER:
|
||||
entity = Bold(start, len(body))
|
||||
entity = Bold(offset=start, length=len(body))
|
||||
elif style == self.ITALIC_DELIMITER:
|
||||
entity = Italic(start, len(body))
|
||||
entity = Italic(offset=start, length=len(body))
|
||||
elif style == self.CODE_DELIMITER:
|
||||
entity = Code(start, len(body))
|
||||
entity = Code(offset=start, length=len(body))
|
||||
elif style == self.PRE_DELIMITER:
|
||||
entity = Pre(start, len(body), "")
|
||||
entity = Pre(offset=start, length=len(body), language="")
|
||||
else:
|
||||
continue
|
||||
|
||||
|
@ -25,5 +25,7 @@ class CallbackGame(PyrogramType):
|
||||
Use BotFather to set up your game.
|
||||
"""
|
||||
|
||||
__slots__ = []
|
||||
|
||||
def __init__(self):
|
||||
super().__init__(None)
|
||||
|
@ -58,16 +58,20 @@ class CallbackQuery(PyrogramType, Update):
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: str,
|
||||
from_user: User,
|
||||
chat_instance: str,
|
||||
message: "pyrogram.Message" = None,
|
||||
inline_message_id: str = None,
|
||||
data: bytes = None,
|
||||
game_short_name: str = None):
|
||||
__slots__ = ["id", "from_user", "chat_instance", "message", "inline_message_id", "data", "game_short_name"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: str,
|
||||
from_user: User,
|
||||
chat_instance: str,
|
||||
message: "pyrogram.Message" = None,
|
||||
inline_message_id: str = None,
|
||||
data: bytes = None,
|
||||
game_short_name: str = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.id = id
|
||||
|
@ -33,8 +33,12 @@ class ForceReply(PyrogramType):
|
||||
2) if the bot's message is a reply (has reply_to_message_id), sender of the original message.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
selective: bool = None):
|
||||
__slots__ = ["selective"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
selective: bool = None
|
||||
):
|
||||
super().__init__(None)
|
||||
|
||||
self.selective = selective
|
||||
|
@ -37,12 +37,16 @@ class GameHighScore(PyrogramType):
|
||||
Position in high score table for the game.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
user: User,
|
||||
score: int,
|
||||
position: int = None):
|
||||
__slots__ = ["user", "score", "position"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
user: User,
|
||||
score: int,
|
||||
position: int = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.user = user
|
||||
|
@ -35,11 +35,15 @@ class GameHighScores(PyrogramType):
|
||||
Game scores.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
game_high_scores: List[GameHighScore]):
|
||||
__slots__ = ["total_count", "game_high_scores"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
game_high_scores: List[GameHighScore]
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.total_count = total_count
|
||||
|
@ -54,13 +54,19 @@ class InlineKeyboardButton(PyrogramType):
|
||||
|
||||
# TODO: Add callback_game and pay fields
|
||||
|
||||
def __init__(self,
|
||||
text: str,
|
||||
callback_data: bytes = None,
|
||||
url: str = None,
|
||||
switch_inline_query: str = None,
|
||||
switch_inline_query_current_chat: str = None,
|
||||
callback_game: CallbackGame = None):
|
||||
__slots__ = [
|
||||
"text", "url", "callback_data", "switch_inline_query", "switch_inline_query_current_chat", "callback_game"
|
||||
]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
text: str,
|
||||
callback_data: bytes = None,
|
||||
url: str = None,
|
||||
switch_inline_query: str = None,
|
||||
switch_inline_query_current_chat: str = None,
|
||||
callback_game: CallbackGame = None
|
||||
):
|
||||
super().__init__(None)
|
||||
|
||||
self.text = str(text)
|
||||
@ -105,16 +111,20 @@ class InlineKeyboardButton(PyrogramType):
|
||||
|
||||
def write(self):
|
||||
if self.callback_data:
|
||||
return KeyboardButtonCallback(self.text, self.callback_data)
|
||||
return KeyboardButtonCallback(text=self.text, data=self.callback_data)
|
||||
|
||||
if self.url:
|
||||
return KeyboardButtonUrl(self.text, self.url)
|
||||
return KeyboardButtonUrl(text=self.text, url=self.url)
|
||||
|
||||
if self.switch_inline_query:
|
||||
return KeyboardButtonSwitchInline(self.text, self.switch_inline_query)
|
||||
return KeyboardButtonSwitchInline(text=self.text, query=self.switch_inline_query)
|
||||
|
||||
if self.switch_inline_query_current_chat:
|
||||
return KeyboardButtonSwitchInline(self.text, self.switch_inline_query_current_chat, same_peer=True)
|
||||
return KeyboardButtonSwitchInline(
|
||||
text=self.text,
|
||||
query=self.switch_inline_query_current_chat,
|
||||
same_peer=True
|
||||
)
|
||||
|
||||
if self.callback_game:
|
||||
return KeyboardButtonGame(self.text)
|
||||
return KeyboardButtonGame(text=self.text)
|
||||
|
@ -31,8 +31,12 @@ class InlineKeyboardMarkup(PyrogramType):
|
||||
List of button rows, each represented by a List of InlineKeyboardButton objects.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
inline_keyboard: List[List[InlineKeyboardButton]]):
|
||||
__slots__ = ["inline_keyboard"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
inline_keyboard: List[List[InlineKeyboardButton]]
|
||||
):
|
||||
super().__init__(None)
|
||||
|
||||
self.inline_keyboard = inline_keyboard
|
||||
@ -55,7 +59,7 @@ class InlineKeyboardMarkup(PyrogramType):
|
||||
|
||||
def write(self):
|
||||
return ReplyInlineMarkup(
|
||||
[KeyboardButtonRow(
|
||||
[j.write() for j in i]
|
||||
rows=[KeyboardButtonRow(
|
||||
buttons=[j.write() for j in i]
|
||||
) for i in self.inline_keyboard]
|
||||
)
|
||||
|
@ -40,10 +40,14 @@ class KeyboardButton(PyrogramType):
|
||||
Available in private chats only.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
text: str,
|
||||
request_contact: bool = None,
|
||||
request_location: bool = None):
|
||||
__slots__ = ["text", "request_contact", "request_location"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
text: str,
|
||||
request_contact: bool = None,
|
||||
request_location: bool = None
|
||||
):
|
||||
super().__init__(None)
|
||||
|
||||
self.text = str(text)
|
||||
@ -71,8 +75,8 @@ class KeyboardButton(PyrogramType):
|
||||
# TODO: Enforce optional args mutual exclusiveness
|
||||
|
||||
if self.request_contact:
|
||||
return KeyboardButtonRequestPhone(self.text)
|
||||
return KeyboardButtonRequestPhone(text=self.text)
|
||||
elif self.request_location:
|
||||
return KeyboardButtonRequestGeoLocation(self.text)
|
||||
return KeyboardButtonRequestGeoLocation(text=self.text)
|
||||
else:
|
||||
return RawKeyboardButton(self.text)
|
||||
return RawKeyboardButton(text=self.text)
|
||||
|
@ -49,11 +49,15 @@ class ReplyKeyboardMarkup(PyrogramType):
|
||||
select the new language. Other users in the group don't see the keyboard.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
keyboard: List[List[Union[KeyboardButton, str]]],
|
||||
resize_keyboard: bool = None,
|
||||
one_time_keyboard: bool = None,
|
||||
selective: bool = None):
|
||||
__slots__ = ["keyboard", "resize_keyboard", "one_time_keyboard", "selective"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
keyboard: List[List[Union[KeyboardButton, str]]],
|
||||
resize_keyboard: bool = None,
|
||||
one_time_keyboard: bool = None,
|
||||
selective: bool = None
|
||||
):
|
||||
super().__init__(None)
|
||||
|
||||
self.keyboard = keyboard
|
||||
@ -83,9 +87,11 @@ class ReplyKeyboardMarkup(PyrogramType):
|
||||
def write(self):
|
||||
return RawReplyKeyboardMarkup(
|
||||
rows=[KeyboardButtonRow(
|
||||
[KeyboardButton(j).write()
|
||||
if isinstance(j, str) else j.write()
|
||||
for j in i]
|
||||
buttons=[
|
||||
KeyboardButton(j).write()
|
||||
if isinstance(j, str) else j.write()
|
||||
for j in i
|
||||
]
|
||||
) for i in self.keyboard],
|
||||
resize=self.resize_keyboard or None,
|
||||
single_use=self.one_time_keyboard or None,
|
||||
|
@ -35,8 +35,12 @@ class ReplyKeyboardRemove(PyrogramType):
|
||||
keyboard for that user, while still showing the keyboard with poll options to users who haven't voted yet.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
selective: bool = None):
|
||||
__slots__ = ["selective"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
selective: bool = None
|
||||
):
|
||||
super().__init__(None)
|
||||
|
||||
self.selective = selective
|
||||
|
@ -18,10 +18,14 @@
|
||||
|
||||
|
||||
class InputMedia:
|
||||
def __init__(self,
|
||||
media: str,
|
||||
caption: str,
|
||||
parse_mode: str):
|
||||
__slots__ = ["media", "caption", "parse_mode"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
media: str,
|
||||
caption: str,
|
||||
parse_mode: str
|
||||
):
|
||||
self.media = media
|
||||
self.caption = caption
|
||||
self.parse_mode = parse_mode
|
||||
|
@ -52,14 +52,18 @@ class InputMediaAnimation(InputMedia):
|
||||
Animation duration.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
media: str,
|
||||
thumb: str = None,
|
||||
caption: str = "",
|
||||
parse_mode: str = "",
|
||||
width: int = 0,
|
||||
height: int = 0,
|
||||
duration: int = 0):
|
||||
__slots__ = ["thumb", "width", "height", "duration"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
media: str,
|
||||
thumb: str = None,
|
||||
caption: str = "",
|
||||
parse_mode: str = "",
|
||||
width: int = 0,
|
||||
height: int = 0,
|
||||
duration: int = 0
|
||||
):
|
||||
super().__init__(media, caption, parse_mode)
|
||||
|
||||
self.thumb = thumb
|
||||
|
@ -53,14 +53,18 @@ class InputMediaAudio(InputMedia):
|
||||
Title of the audio
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
media: str,
|
||||
thumb: str = None,
|
||||
caption: str = "",
|
||||
parse_mode: str = "",
|
||||
duration: int = 0,
|
||||
performer: int = "",
|
||||
title: str = ""):
|
||||
__slots__ = ["thumb", "duration", "performer", "title"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
media: str,
|
||||
thumb: str = None,
|
||||
caption: str = "",
|
||||
parse_mode: str = "",
|
||||
duration: int = 0,
|
||||
performer: int = "",
|
||||
title: str = ""
|
||||
):
|
||||
super().__init__(media, caption, parse_mode)
|
||||
|
||||
self.thumb = thumb
|
||||
|
@ -43,11 +43,15 @@ class InputMediaDocument(InputMedia):
|
||||
Defaults to Markdown.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
media: str,
|
||||
thumb: str = None,
|
||||
caption: str = "",
|
||||
parse_mode: str = ""):
|
||||
__slots__ = ["thumb"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
media: str,
|
||||
thumb: str = None,
|
||||
caption: str = "",
|
||||
parse_mode: str = ""
|
||||
):
|
||||
super().__init__(media, caption, parse_mode)
|
||||
|
||||
self.thumb = thumb
|
||||
|
@ -39,8 +39,12 @@ class InputMediaPhoto(InputMedia):
|
||||
Defaults to Markdown.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
media: str,
|
||||
caption: str = "",
|
||||
parse_mode: str = ""):
|
||||
__slots__ = []
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
media: str,
|
||||
caption: str = "",
|
||||
parse_mode: str = ""
|
||||
):
|
||||
super().__init__(media, caption, parse_mode)
|
||||
|
@ -57,15 +57,19 @@ class InputMediaVideo(InputMedia):
|
||||
Pass True, if the uploaded video is suitable for streaming.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
media: str,
|
||||
thumb: str = None,
|
||||
caption: str = "",
|
||||
parse_mode: str = "",
|
||||
width: int = 0,
|
||||
height: int = 0,
|
||||
duration: int = 0,
|
||||
supports_streaming: bool = True):
|
||||
__slots__ = ["thumb", "width", "height", "duration", "supports_streaming"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
media: str,
|
||||
thumb: str = None,
|
||||
caption: str = "",
|
||||
parse_mode: str = "",
|
||||
width: int = 0,
|
||||
height: int = 0,
|
||||
duration: int = 0,
|
||||
supports_streaming: bool = True
|
||||
):
|
||||
super().__init__(media, caption, parse_mode)
|
||||
|
||||
self.thumb = thumb
|
||||
|
@ -35,10 +35,14 @@ class InputPhoneContact:
|
||||
Contact's last name
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
phone: str,
|
||||
first_name: str,
|
||||
last_name: str = ""):
|
||||
__slots__ = []
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
phone: str,
|
||||
first_name: str,
|
||||
last_name: str = ""
|
||||
):
|
||||
pass
|
||||
|
||||
def __new__(cls,
|
||||
|
@ -57,18 +57,22 @@ class Animation(PyrogramType):
|
||||
Date the animation was sent in Unix time.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
width: int,
|
||||
height: int,
|
||||
duration: int,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None):
|
||||
__slots__ = ["file_id", "thumb", "file_name", "mime_type", "file_size", "date", "width", "height", "duration"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
width: int,
|
||||
height: int,
|
||||
duration: int,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.file_id = file_id
|
||||
|
@ -57,18 +57,22 @@ class Audio(PyrogramType):
|
||||
Title of the audio as defined by sender or by audio tags.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
duration: int,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None,
|
||||
performer: str = None,
|
||||
title: str = None):
|
||||
__slots__ = ["file_id", "thumb", "file_name", "mime_type", "file_size", "date", "duration", "performer", "title"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
duration: int,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None,
|
||||
performer: str = None,
|
||||
title: str = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.file_id = file_id
|
||||
|
@ -42,14 +42,18 @@ class Contact(PyrogramType):
|
||||
Additional data about the contact in the form of a vCard.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
phone_number: str,
|
||||
first_name: str,
|
||||
last_name: str = None,
|
||||
user_id: int = None,
|
||||
vcard: str = None):
|
||||
__slots__ = ["phone_number", "first_name", "last_name", "user_id", "vcard"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
phone_number: str,
|
||||
first_name: str,
|
||||
last_name: str = None,
|
||||
user_id: int = None,
|
||||
vcard: str = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.phone_number = phone_number
|
||||
|
@ -48,15 +48,19 @@ class Document(PyrogramType):
|
||||
Date the document was sent in Unix time.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None):
|
||||
__slots__ = ["file_id", "thumb", "file_name", "mime_type", "file_size", "date"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.file_id = file_id
|
||||
|
@ -48,15 +48,19 @@ class Game(PyrogramType):
|
||||
Upload via BotFather.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: int,
|
||||
title: str,
|
||||
short_name: str,
|
||||
description: str,
|
||||
photo: Photo,
|
||||
animation: Animation = None):
|
||||
__slots__ = ["id", "title", "short_name", "description", "photo", "animation"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: int,
|
||||
title: str,
|
||||
short_name: str,
|
||||
description: str,
|
||||
photo: Photo,
|
||||
animation: Animation = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.id = id
|
||||
|
@ -33,11 +33,15 @@ class Location(PyrogramType):
|
||||
Latitude as defined by sender.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
longitude: float,
|
||||
latitude: float):
|
||||
__slots__ = ["longitude", "latitude"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
longitude: float,
|
||||
latitude: float
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.longitude = longitude
|
||||
|
@ -234,65 +234,80 @@ class Message(PyrogramType, Update):
|
||||
|
||||
# TODO: Add game missing field. Also invoice, successful_payment, connected_website
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
message_id: int,
|
||||
date: int = None,
|
||||
chat: Chat = None,
|
||||
from_user: User = None,
|
||||
forward_from: User = None,
|
||||
forward_from_chat: Chat = None,
|
||||
forward_from_message_id: int = None,
|
||||
forward_signature: str = None,
|
||||
forward_date: int = None,
|
||||
reply_to_message: "Message" = None,
|
||||
mentioned: bool = None,
|
||||
empty: bool = None,
|
||||
service: bool = None,
|
||||
media: bool = None,
|
||||
edit_date: int = None,
|
||||
media_group_id: str = None,
|
||||
author_signature: str = None,
|
||||
text: str = None,
|
||||
entities: List["pyrogram.MessageEntity"] = None,
|
||||
caption_entities: List["pyrogram.MessageEntity"] = None,
|
||||
audio: "pyrogram.Audio" = None,
|
||||
document: "pyrogram.Document" = None,
|
||||
photo: "pyrogram.Photo" = None,
|
||||
sticker: "pyrogram.Sticker" = None,
|
||||
animation: "pyrogram.Animation" = None,
|
||||
game: "pyrogram.Game" = None,
|
||||
video: "pyrogram.Video" = None,
|
||||
voice: "pyrogram.Voice" = None,
|
||||
video_note: "pyrogram.VideoNote" = None,
|
||||
caption: str = None,
|
||||
contact: "pyrogram.Contact" = None,
|
||||
location: "pyrogram.Location" = None,
|
||||
venue: "pyrogram.Venue" = None,
|
||||
web_page: bool = None,
|
||||
poll: "pyrogram.Poll" = None,
|
||||
new_chat_members: List[User] = None,
|
||||
left_chat_member: User = None,
|
||||
new_chat_title: str = None,
|
||||
new_chat_photo: "pyrogram.Photo" = None,
|
||||
delete_chat_photo: bool = None,
|
||||
group_chat_created: bool = None,
|
||||
supergroup_chat_created: bool = None,
|
||||
channel_chat_created: bool = None,
|
||||
migrate_to_chat_id: int = None,
|
||||
migrate_from_chat_id: int = None,
|
||||
pinned_message: "Message" = None,
|
||||
game_high_score: int = None,
|
||||
views: int = None,
|
||||
via_bot: User = None,
|
||||
outgoing: bool = None,
|
||||
matches: List[Match] = None,
|
||||
command: List[str] = None,
|
||||
reply_markup: Union["pyrogram.InlineKeyboardMarkup",
|
||||
"pyrogram.ReplyKeyboardMarkup",
|
||||
"pyrogram.ReplyKeyboardRemove",
|
||||
"pyrogram.ForceReply"] = None):
|
||||
__slots__ = [
|
||||
"message_id", "date", "chat", "from_user", "forward_from", "forward_from_chat", "forward_from_message_id",
|
||||
"forward_signature", "forward_date", "reply_to_message", "mentioned", "empty", "service", "media", "edit_date",
|
||||
"media_group_id", "author_signature", "text", "entities", "caption_entities", "audio", "document", "photo",
|
||||
"sticker", "animation", "game", "video", "voice", "video_note", "caption", "contact", "location", "venue",
|
||||
"web_page", "poll", "new_chat_members", "left_chat_member", "new_chat_title", "new_chat_photo",
|
||||
"delete_chat_photo", "group_chat_created", "supergroup_chat_created", "channel_chat_created",
|
||||
"migrate_to_chat_id", "migrate_from_chat_id", "pinned_message", "game_high_score", "views", "via_bot",
|
||||
"outgoing", "matches", "command", "reply_markup"
|
||||
]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
message_id: int,
|
||||
date: int = None,
|
||||
chat: Chat = None,
|
||||
from_user: User = None,
|
||||
forward_from: User = None,
|
||||
forward_from_chat: Chat = None,
|
||||
forward_from_message_id: int = None,
|
||||
forward_signature: str = None,
|
||||
forward_date: int = None,
|
||||
reply_to_message: "Message" = None,
|
||||
mentioned: bool = None,
|
||||
empty: bool = None,
|
||||
service: bool = None,
|
||||
media: bool = None,
|
||||
edit_date: int = None,
|
||||
media_group_id: str = None,
|
||||
author_signature: str = None,
|
||||
text: str = None,
|
||||
entities: List["pyrogram.MessageEntity"] = None,
|
||||
caption_entities: List["pyrogram.MessageEntity"] = None,
|
||||
audio: "pyrogram.Audio" = None,
|
||||
document: "pyrogram.Document" = None,
|
||||
photo: "pyrogram.Photo" = None,
|
||||
sticker: "pyrogram.Sticker" = None,
|
||||
animation: "pyrogram.Animation" = None,
|
||||
game: "pyrogram.Game" = None,
|
||||
video: "pyrogram.Video" = None,
|
||||
voice: "pyrogram.Voice" = None,
|
||||
video_note: "pyrogram.VideoNote" = None,
|
||||
caption: str = None,
|
||||
contact: "pyrogram.Contact" = None,
|
||||
location: "pyrogram.Location" = None,
|
||||
venue: "pyrogram.Venue" = None,
|
||||
web_page: bool = None,
|
||||
poll: "pyrogram.Poll" = None,
|
||||
new_chat_members: List[User] = None,
|
||||
left_chat_member: User = None,
|
||||
new_chat_title: str = None,
|
||||
new_chat_photo: "pyrogram.Photo" = None,
|
||||
delete_chat_photo: bool = None,
|
||||
group_chat_created: bool = None,
|
||||
supergroup_chat_created: bool = None,
|
||||
channel_chat_created: bool = None,
|
||||
migrate_to_chat_id: int = None,
|
||||
migrate_from_chat_id: int = None,
|
||||
pinned_message: "Message" = None,
|
||||
game_high_score: int = None,
|
||||
views: int = None,
|
||||
via_bot: User = None,
|
||||
outgoing: bool = None,
|
||||
matches: List[Match] = None,
|
||||
command: List[str] = None,
|
||||
reply_markup: Union[
|
||||
"pyrogram.InlineKeyboardMarkup",
|
||||
"pyrogram.ReplyKeyboardMarkup",
|
||||
"pyrogram.ReplyKeyboardRemove",
|
||||
"pyrogram.ForceReply"
|
||||
] = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.message_id = message_id
|
||||
|
@ -47,6 +47,8 @@ class MessageEntity(PyrogramType):
|
||||
For "text_mention" only, the mentioned user.
|
||||
"""
|
||||
|
||||
__slots__ = ["type", "offset", "length", "url", "user"]
|
||||
|
||||
ENTITIES = {
|
||||
types.MessageEntityMention.ID: "mention",
|
||||
types.MessageEntityHashtag.ID: "hashtag",
|
||||
@ -63,14 +65,16 @@ class MessageEntity(PyrogramType):
|
||||
types.MessageEntityPhone.ID: "phone_number"
|
||||
}
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
type: str,
|
||||
offset: int,
|
||||
length: int,
|
||||
url: str = None,
|
||||
user: User = None):
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
type: str,
|
||||
offset: int,
|
||||
length: int,
|
||||
url: str = None,
|
||||
user: User = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.type = type
|
||||
|
@ -37,11 +37,15 @@ class Messages(PyrogramType, Update):
|
||||
Requested messages.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
messages: List[Message]):
|
||||
__slots__ = ["total_count", "messages"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
messages: List[Message]
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.total_count = total_count
|
||||
|
@ -41,12 +41,16 @@ class Photo(PyrogramType):
|
||||
Available sizes of this photo.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: str,
|
||||
date: int,
|
||||
sizes: List[PhotoSize]):
|
||||
__slots__ = ["id", "date", "sizes"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: str,
|
||||
date: int,
|
||||
sizes: List[PhotoSize]
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.id = id
|
||||
|
@ -42,13 +42,17 @@ class PhotoSize(PyrogramType):
|
||||
File size.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
width: int,
|
||||
height: int,
|
||||
file_size: int):
|
||||
__slots__ = ["file_id", "width", "height", "file_size"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
width: int,
|
||||
height: int,
|
||||
file_size: int
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.file_id = file_id
|
||||
|
@ -47,15 +47,19 @@ class Poll(PyrogramType):
|
||||
The index of your chosen option (in case you voted already), None otherwise.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: int,
|
||||
closed: bool,
|
||||
question: str,
|
||||
options: List[PollOption],
|
||||
total_voters: int,
|
||||
option_chosen: int = None):
|
||||
__slots__ = ["id", "closed", "question", "options", "total_voters", "option_chosen"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: int,
|
||||
closed: bool,
|
||||
question: str,
|
||||
options: List[PollOption],
|
||||
total_voters: int,
|
||||
option_chosen: int = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.id = id
|
||||
|
@ -34,12 +34,16 @@ class PollOption(PyrogramType):
|
||||
Unique data that identifies this option among all the other options in a poll.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
text: str,
|
||||
voters: int,
|
||||
data: bytes):
|
||||
__slots__ = ["text", "voters", "data"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
text: str,
|
||||
voters: int,
|
||||
data: bytes
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.text = text
|
||||
|
@ -64,19 +64,25 @@ class Sticker(PyrogramType):
|
||||
|
||||
# TODO: Add mask position
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
width: int,
|
||||
height: int,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None,
|
||||
emoji: str = None,
|
||||
set_name: str = None):
|
||||
__slots__ = [
|
||||
"file_id", "thumb", "file_name", "mime_type", "file_size", "date", "width", "height", "emoji", "set_name"
|
||||
]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
width: int,
|
||||
height: int,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None,
|
||||
emoji: str = None,
|
||||
set_name: str = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.file_id = file_id
|
||||
@ -97,7 +103,10 @@ class Sticker(PyrogramType):
|
||||
try:
|
||||
return send(
|
||||
functions.messages.GetStickerSet(
|
||||
types.InputStickerSetID(*input_sticker_set_id)
|
||||
stickerset=types.InputStickerSetID(
|
||||
id=input_sticker_set_id[0],
|
||||
access_hash=input_sticker_set_id[1]
|
||||
)
|
||||
)
|
||||
).set.short_name
|
||||
except StickersetInvalid:
|
||||
|
@ -34,11 +34,15 @@ class UserProfilePhotos(PyrogramType):
|
||||
Requested profile pictures.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
photos: List[Photo]):
|
||||
__slots__ = ["total_count", "photos"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
photos: List[Photo]
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.total_count = total_count
|
||||
|
@ -44,14 +44,18 @@ class Venue(PyrogramType):
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
location: Location,
|
||||
title: str,
|
||||
address: str,
|
||||
foursquare_id: str = None,
|
||||
foursquare_type: str = None):
|
||||
__slots__ = ["location", "title", "address", "foursquare_id", "foursquare_type"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
location: Location,
|
||||
title: str,
|
||||
address: str,
|
||||
foursquare_id: str = None,
|
||||
foursquare_type: str = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.location = location
|
||||
|
@ -57,18 +57,22 @@ class Video(PyrogramType):
|
||||
Date the video was sent in Unix time.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
width: int,
|
||||
height: int,
|
||||
duration: int,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None):
|
||||
__slots__ = ["file_id", "thumb", "file_name", "mime_type", "file_size", "date", "width", "height", "duration"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
width: int,
|
||||
height: int,
|
||||
duration: int,
|
||||
thumb: PhotoSize = None,
|
||||
file_name: str = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.file_id = file_id
|
||||
|
@ -51,16 +51,20 @@ class VideoNote(PyrogramType):
|
||||
Date the video note was sent in Unix time.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
length: int,
|
||||
duration: int,
|
||||
thumb: PhotoSize = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None):
|
||||
__slots__ = ["file_id", "thumb", "mime_type", "file_size", "date", "length", "duration"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
length: int,
|
||||
duration: int,
|
||||
thumb: PhotoSize = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.file_id = file_id
|
||||
|
@ -47,15 +47,19 @@ class Voice(PyrogramType):
|
||||
Date the voice was sent in Unix time.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
duration: int,
|
||||
waveform: bytes = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None):
|
||||
__slots__ = ["file_id", "duration", "waveform", "mime_type", "file_size", "date"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
file_id: str,
|
||||
duration: int,
|
||||
waveform: bytes = None,
|
||||
mime_type: str = None,
|
||||
file_size: int = None,
|
||||
date: int = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.file_id = file_id
|
||||
|
@ -17,15 +17,17 @@
|
||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from collections import OrderedDict
|
||||
from json import dumps, JSONEncoder
|
||||
from json import dumps
|
||||
|
||||
|
||||
class PyrogramType:
|
||||
__slots__ = ["_client"]
|
||||
|
||||
def __init__(self, client):
|
||||
self._client = client
|
||||
|
||||
def __str__(self):
|
||||
return dumps(self, cls=Encoder, indent=4)
|
||||
return dumps(self, indent=4, default=default, ensure_ascii=False)
|
||||
|
||||
def __getitem__(self, item):
|
||||
return getattr(self, item)
|
||||
@ -40,15 +42,9 @@ def remove_none(obj):
|
||||
return obj
|
||||
|
||||
|
||||
class Encoder(JSONEncoder):
|
||||
def default(self, o: PyrogramType):
|
||||
try:
|
||||
content = {
|
||||
i: getattr(o, i)
|
||||
for i in filter(lambda x: not x.startswith("_"), o.__dict__)
|
||||
}
|
||||
except AttributeError:
|
||||
return repr(o)
|
||||
def default(o: PyrogramType):
|
||||
try:
|
||||
content = {i: getattr(o, i) for i in o.__slots__}
|
||||
|
||||
return remove_none(
|
||||
OrderedDict(
|
||||
@ -56,3 +52,5 @@ class Encoder(JSONEncoder):
|
||||
+ [i for i in content.items()]
|
||||
)
|
||||
)
|
||||
except AttributeError:
|
||||
return repr(o)
|
||||
|
@ -26,6 +26,8 @@ class ContinuePropagation(StopIteration):
|
||||
|
||||
|
||||
class Update:
|
||||
__slots__ = []
|
||||
|
||||
def stop_propagation(self):
|
||||
raise StopPropagation
|
||||
|
||||
|
@ -80,24 +80,32 @@ class Chat(PyrogramType):
|
||||
Information about the chat default permissions.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: int,
|
||||
type: str,
|
||||
title: str = None,
|
||||
username: str = None,
|
||||
first_name: str = None,
|
||||
last_name: str = None,
|
||||
photo: ChatPhoto = None,
|
||||
description: str = None,
|
||||
invite_link: str = None,
|
||||
pinned_message=None,
|
||||
sticker_set_name: str = None,
|
||||
can_set_sticker_set: bool = None,
|
||||
members_count: int = None,
|
||||
restriction_reason: str = None,
|
||||
permissions: "pyrogram.ChatPermissions" = None):
|
||||
__slots__ = [
|
||||
"id", "type", "title", "username", "first_name", "last_name", "photo", "description", "invite_link",
|
||||
"pinned_message", "sticker_set_name", "can_set_sticker_set", "members_count", "restriction_reason",
|
||||
"permissions"
|
||||
]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: int,
|
||||
type: str,
|
||||
title: str = None,
|
||||
username: str = None,
|
||||
first_name: str = None,
|
||||
last_name: str = None,
|
||||
photo: ChatPhoto = None,
|
||||
description: str = None,
|
||||
invite_link: str = None,
|
||||
pinned_message=None,
|
||||
sticker_set_name: str = None,
|
||||
can_set_sticker_set: bool = None,
|
||||
members_count: int = None,
|
||||
restriction_reason: str = None,
|
||||
permissions: "pyrogram.ChatPermissions" = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.id = id
|
||||
|
@ -51,16 +51,20 @@ class ChatMember(PyrogramType):
|
||||
Information about the member permissions.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
user: "pyrogram.User",
|
||||
status: str,
|
||||
date: int = None,
|
||||
invited_by: "pyrogram.User" = None,
|
||||
promoted_by: "pyrogram.User" = None,
|
||||
restricted_by: "pyrogram.User" = None,
|
||||
permissions: "pyrogram.ChatPermissions" = None):
|
||||
__slots__ = ["user", "status", "date", "invited_by", "promoted_by", "restricted_by", "permissions"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
user: "pyrogram.User",
|
||||
status: str,
|
||||
date: int = None,
|
||||
invited_by: "pyrogram.User" = None,
|
||||
promoted_by: "pyrogram.User" = None,
|
||||
restricted_by: "pyrogram.User" = None,
|
||||
permissions: "pyrogram.ChatPermissions" = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.user = user
|
||||
|
@ -35,11 +35,15 @@ class ChatMembers(PyrogramType):
|
||||
Requested chat members.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
chat_members: List[ChatMember]):
|
||||
__slots__ = ["total_count", "chat_members"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
chat_members: List[ChatMember]
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.total_count = total_count
|
||||
|
@ -94,6 +94,13 @@ class ChatPermissions(PyrogramType):
|
||||
True, if polls can be sent, implies can_send_media_messages.
|
||||
"""
|
||||
|
||||
__slots__ = [
|
||||
"until_date", "can_be_edited", "can_change_info", "can_post_messages", "can_edit_messages",
|
||||
"can_delete_messages", "can_restrict_members", "can_invite_users", "can_pin_messages", "can_promote_members",
|
||||
"can_send_messages", "can_send_media_messages", "can_send_other_messages", "can_add_web_page_previews",
|
||||
"can_send_polls"
|
||||
]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
|
@ -35,11 +35,15 @@ class ChatPhoto(PyrogramType):
|
||||
Unique file identifier of big (640x640) chat photo. This file_id can be used only for photo download.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
small_file_id: str,
|
||||
big_file_id: str):
|
||||
__slots__ = ["small_file_id", "big_file_id"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
small_file_id: str,
|
||||
big_file_id: str
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.small_file_id = small_file_id
|
||||
|
@ -45,14 +45,18 @@ class ChatPreview(PyrogramType):
|
||||
Preview of some of the chat members.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
title: str,
|
||||
photo: ChatPhoto,
|
||||
type: str,
|
||||
members_count: int,
|
||||
members: List[User] = None):
|
||||
__slots__ = ["title", "photo", "type", "members_count", "members"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
title: str,
|
||||
photo: ChatPhoto,
|
||||
type: str,
|
||||
members_count: int,
|
||||
members: List[User] = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.title = title
|
||||
|
@ -46,15 +46,19 @@ class Dialog(PyrogramType):
|
||||
True, if the dialog is pinned.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
chat: Chat,
|
||||
top_message: "pyrogram.Message",
|
||||
unread_messages_count: int,
|
||||
unread_mentions_count: int,
|
||||
unread_mark: bool,
|
||||
is_pinned: bool):
|
||||
__slots__ = ["chat", "top_message", "unread_messages_count", "unread_mentions_count", "unread_mark", "is_pinned"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
chat: Chat,
|
||||
top_message: "pyrogram.Message",
|
||||
unread_messages_count: int,
|
||||
unread_mentions_count: int,
|
||||
unread_mark: bool,
|
||||
is_pinned: bool
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.chat = chat
|
||||
|
@ -36,11 +36,15 @@ class Dialogs(PyrogramType):
|
||||
Requested dialogs.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
dialogs: List[Dialog]):
|
||||
__slots__ = ["total_count", "dialogs"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
total_count: int,
|
||||
dialogs: List[Dialog]
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.total_count = total_count
|
||||
|
@ -70,23 +70,30 @@ class User(PyrogramType):
|
||||
The reason why this bot might be unavailable to some users.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: int,
|
||||
is_self: bool,
|
||||
is_contact: bool,
|
||||
is_mutual_contact: bool,
|
||||
is_deleted: bool,
|
||||
is_bot: bool,
|
||||
first_name: str,
|
||||
last_name: str = None,
|
||||
status: UserStatus = None,
|
||||
username: str = None,
|
||||
language_code: str = None,
|
||||
phone_number: str = None,
|
||||
photo: ChatPhoto = None,
|
||||
restriction_reason: str = None):
|
||||
__slots__ = [
|
||||
"id", "is_self", "is_contact", "is_mutual_contact", "is_deleted", "is_bot", "first_name", "last_name", "status",
|
||||
"username", "language_code", "phone_number", "photo", "restriction_reason"
|
||||
]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
id: int,
|
||||
is_self: bool,
|
||||
is_contact: bool,
|
||||
is_mutual_contact: bool,
|
||||
is_deleted: bool,
|
||||
is_bot: bool,
|
||||
first_name: str,
|
||||
last_name: str = None,
|
||||
status: UserStatus = None,
|
||||
username: str = None,
|
||||
language_code: str = None,
|
||||
phone_number: str = None,
|
||||
photo: ChatPhoto = None,
|
||||
restriction_reason: str = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.id = id
|
||||
|
@ -65,17 +65,21 @@ class UserStatus(PyrogramType, Update):
|
||||
always shown to blocked users), None otherwise.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
user_id: int,
|
||||
online: bool = None,
|
||||
offline: bool = None,
|
||||
date: int = None,
|
||||
recently: bool = None,
|
||||
within_week: bool = None,
|
||||
within_month: bool = None,
|
||||
long_time_ago: bool = None):
|
||||
__slots__ = ["user_id", "online", "offline", "date", "recently", "within_week", "within_month", "long_time_ago"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
client: "pyrogram.client.ext.BaseClient",
|
||||
user_id: int,
|
||||
online: bool = None,
|
||||
offline: bool = None,
|
||||
date: int = None,
|
||||
recently: bool = None,
|
||||
within_week: bool = None,
|
||||
within_month: bool = None,
|
||||
long_time_ago: bool = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
self.user_id = user_id
|
||||
|
@ -45,10 +45,10 @@ class Auth:
|
||||
@staticmethod
|
||||
def pack(data: Object) -> bytes:
|
||||
return (
|
||||
bytes(8)
|
||||
+ Long(MsgId())
|
||||
+ Int(len(data.write()))
|
||||
+ data.write()
|
||||
bytes(8)
|
||||
+ Long(MsgId())
|
||||
+ Int(len(data.write()))
|
||||
+ data.write()
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
@ -83,7 +83,7 @@ class Auth:
|
||||
# Step 1; Step 2
|
||||
nonce = int.from_bytes(urandom(16), "little", signed=True)
|
||||
log.debug("Send req_pq: {}".format(nonce))
|
||||
res_pq = self.send(functions.ReqPqMulti(nonce))
|
||||
res_pq = self.send(functions.ReqPqMulti(nonce=nonce))
|
||||
log.debug("Got ResPq: {}".format(res_pq.server_nonce))
|
||||
log.debug("Server public key fingerprints: {}".format(res_pq.server_public_key_fingerprints))
|
||||
|
||||
@ -110,12 +110,12 @@ class Auth:
|
||||
new_nonce = int.from_bytes(urandom(32), "little", signed=True)
|
||||
|
||||
data = types.PQInnerData(
|
||||
res_pq.pq,
|
||||
p.to_bytes(4, "big"),
|
||||
q.to_bytes(4, "big"),
|
||||
nonce,
|
||||
server_nonce,
|
||||
new_nonce,
|
||||
pq=res_pq.pq,
|
||||
p=p.to_bytes(4, "big"),
|
||||
q=q.to_bytes(4, "big"),
|
||||
nonce=nonce,
|
||||
server_nonce=server_nonce,
|
||||
new_nonce=new_nonce,
|
||||
).write()
|
||||
|
||||
sha = sha1(data).digest()
|
||||
@ -129,12 +129,12 @@ class Auth:
|
||||
log.debug("Send req_DH_params")
|
||||
server_dh_params = self.send(
|
||||
functions.ReqDHParams(
|
||||
nonce,
|
||||
server_nonce,
|
||||
p.to_bytes(4, "big"),
|
||||
q.to_bytes(4, "big"),
|
||||
public_key_fingerprint,
|
||||
encrypted_data
|
||||
nonce=nonce,
|
||||
server_nonce=server_nonce,
|
||||
p=p.to_bytes(4, "big"),
|
||||
q=q.to_bytes(4, "big"),
|
||||
public_key_fingerprint=public_key_fingerprint,
|
||||
encrypted_data=encrypted_data
|
||||
)
|
||||
)
|
||||
|
||||
@ -144,13 +144,13 @@ class Auth:
|
||||
new_nonce = new_nonce.to_bytes(32, "little", signed=True)
|
||||
|
||||
tmp_aes_key = (
|
||||
sha1(new_nonce + server_nonce).digest()
|
||||
+ sha1(server_nonce + new_nonce).digest()[:12]
|
||||
sha1(new_nonce + server_nonce).digest()
|
||||
+ sha1(server_nonce + new_nonce).digest()[:12]
|
||||
)
|
||||
|
||||
tmp_aes_iv = (
|
||||
sha1(server_nonce + new_nonce).digest()[12:]
|
||||
+ sha1(new_nonce + new_nonce).digest() + new_nonce[:4]
|
||||
sha1(server_nonce + new_nonce).digest()[12:]
|
||||
+ sha1(new_nonce + new_nonce).digest() + new_nonce[:4]
|
||||
)
|
||||
|
||||
server_nonce = int.from_bytes(server_nonce, "little", signed=True)
|
||||
@ -175,10 +175,10 @@ class Auth:
|
||||
retry_id = 0
|
||||
|
||||
data = types.ClientDHInnerData(
|
||||
nonce,
|
||||
server_nonce,
|
||||
retry_id,
|
||||
g_b
|
||||
nonce=nonce,
|
||||
server_nonce=server_nonce,
|
||||
retry_id=retry_id,
|
||||
g_b=g_b
|
||||
).write()
|
||||
|
||||
sha = sha1(data).digest()
|
||||
@ -189,9 +189,9 @@ class Auth:
|
||||
log.debug("Send set_client_DH_params")
|
||||
set_client_dh_params_answer = self.send(
|
||||
functions.SetClientDHParams(
|
||||
nonce,
|
||||
server_nonce,
|
||||
encrypted_data
|
||||
nonce=nonce,
|
||||
server_nonce=server_nonce,
|
||||
encrypted_data=encrypted_data
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -134,11 +134,11 @@ class Session:
|
||||
self.current_salt = FutureSalt(
|
||||
0, 0,
|
||||
self._send(
|
||||
functions.Ping(0),
|
||||
functions.Ping(ping_id=0),
|
||||
timeout=self.START_TIMEOUT
|
||||
).new_server_salt
|
||||
)
|
||||
self.current_salt = self._send(functions.GetFutureSalts(1), timeout=self.START_TIMEOUT).salts[0]
|
||||
self.current_salt = self._send(functions.GetFutureSalts(num=1), timeout=self.START_TIMEOUT).salts[0]
|
||||
|
||||
self.next_salt_thread = Thread(target=self.next_salt, name="NextSaltThread")
|
||||
self.next_salt_thread.start()
|
||||
@ -146,8 +146,8 @@ class Session:
|
||||
if not self.is_cdn:
|
||||
self._send(
|
||||
functions.InvokeWithLayer(
|
||||
layer,
|
||||
functions.InitConnection(
|
||||
layer=layer,
|
||||
query=functions.InitConnection(
|
||||
api_id=self.client.api_id,
|
||||
app_version=self.client.app_version,
|
||||
device_model=self.client.device_model,
|
||||
@ -314,7 +314,7 @@ class Session:
|
||||
log.info("Send {} acks".format(len(self.pending_acks)))
|
||||
|
||||
try:
|
||||
self._send(types.MsgsAck(list(self.pending_acks)), False)
|
||||
self._send(types.MsgsAck(msg_ids=list(self.pending_acks)), False)
|
||||
except (OSError, TimeoutError):
|
||||
pass
|
||||
else:
|
||||
@ -335,7 +335,7 @@ class Session:
|
||||
|
||||
try:
|
||||
self._send(functions.PingDelayDisconnect(
|
||||
0, self.WAIT_TIMEOUT + 10
|
||||
ping_id=0, disconnect_delay=self.WAIT_TIMEOUT + 10
|
||||
), False)
|
||||
except (OSError, TimeoutError, Error):
|
||||
pass
|
||||
@ -365,7 +365,7 @@ class Session:
|
||||
break
|
||||
|
||||
try:
|
||||
self.current_salt = self._send(functions.GetFutureSalts(1)).salts[0]
|
||||
self.current_salt = self._send(functions.GetFutureSalts(num=1)).salts[0]
|
||||
except (OSError, TimeoutError, Error):
|
||||
self.connection.close()
|
||||
break
|
||||
|
Loading…
x
Reference in New Issue
Block a user