@@ -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