mirror of
https://github.com/pyrogram/pyrogram
synced 2025-08-29 13:27:47 +00:00
Add smarter auth import to deal with race conditions by multi sessions
- Add a retry mechanism (up to three times) - Narrow the window in which export+import executes - Remove a line of duplicated code Fixes #299
This commit is contained in:
parent
5665f980ea
commit
c1321a4c01
@ -45,7 +45,7 @@ from pyrogram.errors import (
|
|||||||
PhoneCodeExpired, PhoneCodeEmpty, SessionPasswordNeeded,
|
PhoneCodeExpired, PhoneCodeEmpty, SessionPasswordNeeded,
|
||||||
PasswordHashInvalid, FloodWait, PeerIdInvalid, FirstnameInvalid, PhoneNumberBanned,
|
PasswordHashInvalid, FloodWait, PeerIdInvalid, FirstnameInvalid, PhoneNumberBanned,
|
||||||
VolumeLocNotFound, UserMigrate, ChannelPrivate, PhoneNumberOccupied,
|
VolumeLocNotFound, UserMigrate, ChannelPrivate, PhoneNumberOccupied,
|
||||||
PasswordRecoveryNa, PasswordEmpty
|
PasswordRecoveryNa, PasswordEmpty, AuthBytesInvalid
|
||||||
)
|
)
|
||||||
from pyrogram.session import Auth, Session
|
from pyrogram.session import Auth, Session
|
||||||
from .ext import utils, Syncer, BaseClient, Dispatcher
|
from .ext import utils, Syncer, BaseClient, Dispatcher
|
||||||
@ -1229,7 +1229,7 @@ class Client(Methods, BaseClient):
|
|||||||
def load_config(self):
|
def load_config(self):
|
||||||
parser = ConfigParser()
|
parser = ConfigParser()
|
||||||
parser.read(str(self.config_file))
|
parser.read(str(self.config_file))
|
||||||
|
|
||||||
if self.bot_token:
|
if self.bot_token:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
@ -1720,30 +1720,35 @@ class Client(Methods, BaseClient):
|
|||||||
|
|
||||||
if session is None:
|
if session is None:
|
||||||
if dc_id != self.storage.dc_id:
|
if dc_id != self.storage.dc_id:
|
||||||
exported_auth = self.send(
|
|
||||||
functions.auth.ExportAuthorization(
|
|
||||||
dc_id=dc_id
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
session = Session(self, dc_id, Auth(self, dc_id).create(), is_media=True)
|
session = Session(self, dc_id, Auth(self, dc_id).create(), is_media=True)
|
||||||
|
|
||||||
session.start()
|
session.start()
|
||||||
|
|
||||||
self.media_sessions[dc_id] = session
|
for _ in range(3):
|
||||||
|
exported_auth = self.send(
|
||||||
session.send(
|
functions.auth.ExportAuthorization(
|
||||||
functions.auth.ImportAuthorization(
|
dc_id=dc_id
|
||||||
id=exported_auth.id,
|
)
|
||||||
bytes=exported_auth.bytes
|
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
try:
|
||||||
|
session.send(
|
||||||
|
functions.auth.ImportAuthorization(
|
||||||
|
id=exported_auth.id,
|
||||||
|
bytes=exported_auth.bytes
|
||||||
|
)
|
||||||
|
)
|
||||||
|
except AuthBytesInvalid:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
session.stop()
|
||||||
|
raise AuthBytesInvalid
|
||||||
else:
|
else:
|
||||||
session = Session(self, dc_id, self.storage.auth_key, is_media=True)
|
session = Session(self, dc_id, self.storage.auth_key, is_media=True)
|
||||||
|
|
||||||
session.start()
|
session.start()
|
||||||
|
|
||||||
self.media_sessions[dc_id] = session
|
self.media_sessions[dc_id] = session
|
||||||
|
|
||||||
if media_type == 1:
|
if media_type == 1:
|
||||||
location = types.InputPeerPhotoFileLocation(
|
location = types.InputPeerPhotoFileLocation(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user