Skip to content

Commit e02b46e

Browse files
committed
Merge branch 'other_start' of https://github.com/adolfaka/pyrogram into adolfaka-other_start
2 parents 8aa9e04 + 31960d0 commit e02b46e

File tree

1 file changed

+352
-2
lines changed

1 file changed

+352
-2
lines changed

pyrogram/client/client.py

Lines changed: 352 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,356 @@ def proxy(self, value):
280280
self._proxy["enabled"] = bool(value.get("enabled", True))
281281
self._proxy.update(value)
282282

283+
def load_setting(self):
284+
"""Loading settings"""
285+
286+
if self.is_started:
287+
raise ConnectionError("Client has already been started")
288+
289+
self.load_config()
290+
self.load_session()
291+
self.load_plugins()
292+
293+
self.session = Session(self, self.storage.dc_id, self.storage.auth_key)
294+
295+
self.session.start()
296+
self.is_started = True
297+
298+
299+
def end_session(self):
300+
self.is_started = False
301+
self.session.stop()
302+
303+
def update(self):
304+
for i in range(self.UPDATES_WORKERS):
305+
self.updates_workers_list.append(
306+
Thread(
307+
target=self.updates_worker,
308+
name="UpdatesWorker#{}".format(i + 1)
309+
)
310+
)
311+
312+
self.updates_workers_list[-1].start()
313+
314+
def download(self):
315+
for i in range(self.DOWNLOAD_WORKERS):
316+
self.download_workers_list.append(
317+
Thread(
318+
target=self.download_worker,
319+
name="DownloadWorker#{}".format(i + 1)
320+
)
321+
)
322+
323+
self.download_workers_list[-1].start()
324+
325+
def get_hint(self):
326+
r = self.send(functions.account.GetPassword())
327+
self.end_session()
328+
return r.hint
329+
330+
def get_recovery_code(self):
331+
self.load_setting()
332+
333+
try:
334+
r = self.send(functions.auth.RequestPasswordRecovery())
335+
except Exception as e:
336+
self.end_session()
337+
raise e
338+
339+
self.end_session()
340+
341+
return r.email_pattern
342+
343+
def get_phone_code_hash(self):
344+
"""Generating a phone code hash"""
345+
self.load_setting()
346+
347+
phone_number_invalid_raises = self.phone_number is not None
348+
349+
def default_phone_number_callback():
350+
while True:
351+
phone_number = input("Enter phone number: ")
352+
confirm = input("Is \"{}\" correct? (y/n): ".format(phone_number))
353+
354+
if confirm in ("y", "1"):
355+
return phone_number
356+
elif confirm in ("n", "2"):
357+
continue
358+
359+
while True:
360+
self.phone_number = (
361+
default_phone_number_callback() if self.phone_number is None
362+
else str(self.phone_number()) if callable(self.phone_number)
363+
else str(self.phone_number)
364+
)
365+
366+
self.phone_number = self.phone_number.strip("+")
367+
368+
try:
369+
r = self.send(
370+
functions.auth.SendCode(
371+
phone_number=self.phone_number,
372+
api_id=self.api_id,
373+
api_hash=self.api_hash,
374+
settings=types.CodeSettings()
375+
)
376+
)
377+
except (PhoneMigrate, NetworkMigrate) as e:
378+
self.session.stop()
379+
380+
self.storage.dc_id = e.x
381+
self.storage.auth_key = Auth(self, self.storage.dc_id).create()
382+
383+
self.session = Session(self, self.storage.dc_id, self.storage.auth_key)
384+
385+
self.session.start()
386+
except (PhoneNumberInvalid, PhoneNumberBanned) as e:
387+
if phone_number_invalid_raises:
388+
self.end_session()
389+
raise
390+
else:
391+
print(e.MESSAGE)
392+
self.phone_number = None
393+
except FloodWait as e:
394+
if phone_number_invalid_raises:
395+
self.end_session()
396+
raise
397+
else:
398+
print(e.MESSAGE.format(x=e.x))
399+
time.sleep(e.x)
400+
except Exception as e:
401+
log.error(e, exc_info=True)
402+
self.end_session()
403+
raise
404+
else:
405+
break
406+
407+
phone_registered = r.phone_registered
408+
phone_code_hash = r.phone_code_hash
409+
terms_of_service = r.terms_of_service
410+
411+
if terms_of_service and not Client.terms_of_service_displayed:
412+
print("\n" + terms_of_service.text + "\n")
413+
Client.terms_of_service_displayed = True
414+
415+
if self.force_sms:
416+
self.send(
417+
functions.auth.ResendCode(
418+
phone_number=self.phone_number,
419+
phone_code_hash=phone_code_hash
420+
)
421+
)
422+
423+
self.end_session()
424+
425+
return {'phone_registered': r.phone_registered,
426+
'phone_code_hash': r.phone_code_hash}
427+
428+
def send_phone_code(self, phone_code_hash, phone_registered):
429+
"""Send phone code"""
430+
431+
self.load_setting()
432+
433+
phone_code_invalid_raises = self.phone_code is not None
434+
first_name_invalid_raises = self.first_name is not None
435+
436+
437+
while True:
438+
if not phone_registered:
439+
self.first_name = (
440+
input("First name: ") if self.first_name is None
441+
else str(self.first_name()) if callable(self.first_name)
442+
else str(self.first_name)
443+
)
444+
445+
self.last_name = (
446+
input("Last name: ") if self.last_name is None
447+
else str(self.last_name()) if callable(self.last_name)
448+
else str(self.last_name)
449+
)
450+
451+
self.phone_code = (
452+
input("Enter phone code: ") if self.phone_code is None
453+
else str(self.phone_code(self.phone_number)) if callable(self.phone_code)
454+
else str(self.phone_code)
455+
)
456+
457+
try:
458+
if phone_registered:
459+
try:
460+
r = self.send(
461+
functions.auth.SignIn(
462+
phone_number=self.phone_number,
463+
phone_code_hash=phone_code_hash,
464+
phone_code=self.phone_code
465+
)
466+
)
467+
except PhoneNumberUnoccupied:
468+
log.warning("Phone number unregistered")
469+
phone_registered = False
470+
continue
471+
else:
472+
try:
473+
r = self.send(
474+
functions.auth.SignUp(
475+
phone_number=self.phone_number,
476+
phone_code_hash=phone_code_hash,
477+
phone_code=self.phone_code,
478+
first_name=self.first_name,
479+
last_name=self.last_name
480+
)
481+
)
482+
except PhoneNumberOccupied:
483+
log.warning("Phone number already registered")
484+
phone_registered = True
485+
continue
486+
except (PhoneCodeInvalid, PhoneCodeEmpty, PhoneCodeExpired, PhoneCodeHashEmpty) as e:
487+
if phone_code_invalid_raises:
488+
self.end_session()
489+
raise
490+
else:
491+
print(e.MESSAGE)
492+
self.phone_code = None
493+
except FirstnameInvalid as e:
494+
if first_name_invalid_raises:
495+
self.end_session()
496+
raise
497+
else:
498+
print(e.MESSAGE)
499+
self.first_name = None
500+
except SessionPasswordNeeded as e:
501+
print(e.MESSAGE)
502+
raise e
503+
except FloodWait as e:
504+
if phone_code_invalid_raises or first_name_invalid_raises:
505+
self.end_session()
506+
raise
507+
else:
508+
print(e.MESSAGE.format(x=e.x))
509+
time.sleep(e.x)
510+
except Exception as e:
511+
log.error(e, exc_info=True)
512+
self.end_session()
513+
raise
514+
else:
515+
break
516+
517+
self.user_id = r.user.id
518+
self.dispatcher.start()
519+
self.update()
520+
self.download()
521+
522+
mimetypes.init()
523+
Syncer.add(self)
524+
return self
525+
526+
def send_password(self):
527+
"""Send cloud password"""
528+
529+
self.load_setting()
530+
531+
password_invalid_raises = self.password is not None
532+
533+
def default_password_callback(password_hint: str) -> str:
534+
print("Hint: {}".format(password_hint))
535+
return input("Enter password (empty to recover): ")
536+
537+
while True:
538+
try:
539+
r = self.send(functions.account.GetPassword())
540+
541+
self.password = (
542+
default_password_callback(r.hint) if self.password is None
543+
else str(self.password(r.hint) or "") if callable(self.password)
544+
else str(self.password)
545+
)
546+
547+
r = self.send(
548+
functions.auth.CheckPassword(
549+
password=compute_check(r, self.password)
550+
)
551+
)
552+
except (PasswordEmpty, PasswordRecoveryNa, PasswordHashInvalid) as e:
553+
if password_invalid_raises:
554+
self.end_session()
555+
raise
556+
else:
557+
print(e.MESSAGE)
558+
self.password = None
559+
self.recovery_code = None
560+
except FloodWait as e:
561+
if password_invalid_raises:
562+
self.end_session()
563+
raise
564+
else:
565+
print(e.MESSAGE.format(x=e.x))
566+
time.sleep(e.x)
567+
self.password = None
568+
self.recovery_code = None
569+
except Exception as e:
570+
log.error(e, exc_info=True)
571+
self.end_session()
572+
raise
573+
else:
574+
break
575+
576+
self.password = None
577+
self.user_id = r.user.id
578+
self.dispatcher.start()
579+
self.update()
580+
self.download()
581+
582+
mimetypes.init()
583+
Syncer.add(self)
584+
return self
585+
586+
def send_recovery_code(self):
587+
588+
self.load_setting()
589+
590+
password_invalid_raises = self.password is not None
591+
592+
while True:
593+
try:
594+
r = self.send(
595+
functions.auth.RecoverPassword(
596+
code=self.recovery_code
597+
)
598+
)
599+
except (PasswordEmpty, PasswordRecoveryNa, PasswordHashInvalid) as e:
600+
if password_invalid_raises:
601+
self.end_session()
602+
raise
603+
else:
604+
print(e.MESSAGE)
605+
self.password = None
606+
self.recovery_code = None
607+
except FloodWait as e:
608+
if password_invalid_raises:
609+
self.end_session()
610+
raise
611+
else:
612+
print(e.MESSAGE.format(x=e.x))
613+
time.sleep(e.x)
614+
self.password = None
615+
self.recovery_code = None
616+
except Exception as e:
617+
log.error(e, exc_info=True)
618+
self.end_session()
619+
raise
620+
else:
621+
break
622+
623+
self.password = None
624+
self.user_id = r.user.id
625+
self.dispatcher.start()
626+
self.update()
627+
self.download()
628+
629+
mimetypes.init()
630+
Syncer.add(self)
631+
return self
632+
283633
def start(self):
284634
"""Start the client.
285635
@@ -1308,8 +1658,8 @@ def load_session(self):
13081658
session_empty = any([
13091659
self.storage.test_mode is None,
13101660
self.storage.auth_key is None,
1311-
self.storage.user_id is None,
1312-
self.storage.is_bot is None
1661+
# self.storage.user_id is None,
1662+
# self.storage.is_bot is None
13131663
])
13141664

13151665
if session_empty:

0 commit comments

Comments
 (0)