Advertisement
KosmosilaBY

Untitled

May 28th, 2022
1,235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.29 KB | None | 0 0
  1. import os, re
  2. from random import randint
  3.  
  4.  
  5. def cls():
  6.     """Функция очистки консоли"""
  7.     os.system('cls' if os.name == 'nt' else 'clear')
  8.  
  9.  
  10. class Identification:
  11.     """Регистрация, идентификация и авторизация пользователя"""
  12.  
  13.     __users = {
  14.         'vasya@mail.ru': {'name': 'Vasya',
  15.                           'surname': 'Pupkin',
  16.                           'password': 'lox45',
  17.                           'code_name': 'bloha',
  18.                           'money': 750,
  19.                           },
  20.         'psix@ya.ru': {'name': 'Anton',
  21.                        'surname': 'Olegovich',
  22.                        'password': 'plums',
  23.                        'code_name': 'atom',
  24.                        'money': 632,
  25.                        },
  26.     }
  27.  
  28.     def __init__(self, email, password):
  29.         """Инициализация экземпляра класса"""
  30.         self.email = email
  31.         self.__password = password
  32.         self.__code_name = Identification.__users[email]["code_name"]
  33.         self.full_name = f'{Identification.__users[email]["name"]} {Identification.__users[email]["surname"]}'
  34.         self.money = Identification.__users[email]["money"]
  35.  
  36.     def __str__(self):
  37.         """Метод отображения информации при вызове функции print() с аргументом нашего экземпляра"""
  38.         return f'Пользователь: {self.full_name} \nПочта: {self.email} \nСумма на счету: {self.money} рубля(ей)\n'
  39.  
  40.     def send_money(self):
  41.         """Метод перевода денег в фонд нищих"""
  42.         if self.money > 0:  # Проверяем есть ли деньги на счету.
  43.             print('Сколько будем переводить?')
  44.             sum_to_send = int(input('Введите сумму: '))
  45.             while sum_to_send > self.money:  # Проверяем не захотел ли юзер отправить больше чем у него есть
  46.                 sum_to_send = int(
  47.                     input(f'У Вас всего-то {self.money} рубля(ей) на счету. Введите сумму не превышающую баланс: '))
  48.             while entered_code := input(
  49.                     'Введите кодовое слово: ') != self.__code_name:  # Проверяем на правильность кодового слова для перевода денег
  50.                 print('Неверное кодовое слово')
  51.                 continue  # Идем на следующий цикл
  52.             self.money -= sum_to_send  # Списываем с баланса
  53.         else:  # Если нету денег на счету
  54.             return print('Вы не в состоянии позволить себе денежные переводы.\n')
  55.         cls()
  56.         return print('Ваши деньги ушли в фонд нищих.\n')
  57.  
  58.     @classmethod
  59.     def _check_user(cls, email, password):
  60.         """Метод проверки есть ли пользователь в БД и совпадает ли пароль при логине,
  61.        а так же если выбран режим регистрации нового user'a (передавая email и None в
  62.         аргументах) проверяет есть ли уже такой user"""
  63.         if password is None:  # Проверка при регистрации нового юзера
  64.             return email in cls.__users
  65.         if email not in cls.__users:  # Проверка при логине есть ли юзер в БД
  66.             return (False, 'no_user')
  67.         if cls.__users[email]['password'] != password:  # Если юзер в БД - проверяем пароль
  68.             return (False, 'bad_password')
  69.         return (True,)  # Возврат если все ОК
  70.  
  71.     @classmethod
  72.     def _register_user(cls, email, name, surname, password, code_word):
  73.         """Метод добавления нового пользователя в БД
  74.        Деньги - акция от банка за регистрацию от 500 до 1000р )"""
  75.         cls.__users[email] = {'name': name,
  76.                               'surname': surname,
  77.                               'password': password,
  78.                               'code_name': code_word,
  79.                               'money': randint(500, 1000)
  80.                               }
  81.  
  82.  
  83. def check_email(email):
  84.     """Функция проверки емейла на корректность"""
  85.     regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')
  86.     while not re.fullmatch(regex, email):
  87.         print('Введен не корректный email, попробуйте еще раз.')
  88.         email = input('Введите Ваш email: ').lower()
  89.     return email
  90.  
  91. def register_user():
  92.     """Функция регистрации нового пользователя"""
  93.     cls()
  94.     print('Регистрация нового пользователя.')
  95.     email = check_email(input('Введите Ваш email: ').lower())
  96.     while Identification._check_user(email, None):  # Проверка есть ли user с таким email в БД
  97.         print('Такой пользователь уже сужествует.')
  98.         email = check_email(input('Введите Ваш email: ').lower())
  99.     name = input('Введите Ваше имя: ').capitalize()
  100.     surname = input('Введите Вашу фамилию: ').capitalize()
  101.     while True:  # Проверка на совпадение паролей. Цикл будет выполняться пока пароль не совпадет.
  102.         pass1 = input('Введите пароль: ')
  103.         pass2 = input('Повторите пароль: ')
  104.         if pass1 == pass2:
  105.             password = pass1
  106.             break
  107.         print('Пароли не совпадают. Повторите ввод.')
  108.     code_word = input('Введите кодовое слово: ')
  109.     return Identification._register_user(email, name, surname, password, code_word)
  110.     # Вызываем метод класса добавления пользователя в БД
  111.  
  112.  
  113. def enter_email_pass():
  114.     """ Функция ввода е-мейла и пароля. Возвращает кортеж (email, password)"""
  115.     email = check_email(input('Введите Ваш email: ').lower())
  116.     password = input('Введите пароль: ')
  117.     return email, password
  118.  
  119.  
  120. def login():
  121.     """ Функция опции 'Войти в систему' """
  122.     cls()
  123.     print('Вход в систему.')
  124.     email, password = enter_email_pass()
  125.     check_user_result = Identification._check_user(email, password)
  126.     while check_user_result[0] != True:  # Пока проверка не вернет что user есть в БД и введен правильный пароль
  127.         if check_user_result[1] == 'no_user':  # Если юзера нет - предлагаем зарегистрироваться
  128.             answer = input('Такого пользователя не существует. Хотите зарегистрироваться? (y / n) ')
  129.             if answer.lower() == 'y':
  130.                 register_user()
  131.                 cls()
  132.                 print('Спасибо за регистрацию. Можете войти в систему.')
  133.                 email, password = enter_email_pass()
  134.                 check_user_result = Identification._check_user(email, password)
  135.                 continue
  136.             else:
  137.                 print('Как хотите... \n')
  138.                 input('Нажите Enter для возврата в главное меню.')
  139.                 cls()
  140.                 return False
  141.         elif check_user_result[1] == 'bad_password':  # Если user есть, но пароль неверный
  142.             print('Введен неверный пароль. Повторите попытку.')
  143.             password = input('Введите пароль: ')
  144.             check_user_result = Identification._check_user(email, password)
  145.     return Identification(email, password)  # Если прошли проверку, то авторизуемся. (создается экземпляр класса)
  146.  
  147.  
  148. while True:  # Основной цикл программы
  149.     print('1. Войти в систему')
  150.     print('2. Зарегистрироваться')
  151.     print('3. Завершить работу')
  152.     choise = input('Сделайте свой выбор: ')
  153.     if choise == '1':
  154.         cls()
  155.         user = login()
  156.         if not user:
  157.             continue
  158.     elif choise == '2':
  159.         register_user()
  160.         cls()
  161.         print('Регистрация прошла успешно.')
  162.         continue
  163.     elif choise == '3':
  164.         print('До свидания')
  165.         break
  166.     else:
  167.         print('Выберите 1, 2 или 3')
  168.         continue
  169.     cls()
  170.     while True:  # Цикл программы после удачной авторизации
  171.         print(f'{user.full_name}, что будем делать дальше?')
  172.         print('1. Информация о пользователе')
  173.         print('2. Остаток на счету')
  174.         print('3. Перевести деньги')
  175.         print('4. Выйти из системы')
  176.         print('5. Завершить работу')
  177.         choise = input('Сделайте свой выбор: ')
  178.         if choise == '1':
  179.             cls()
  180.             print(user)
  181.             continue
  182.         if choise == '2':
  183.             cls()
  184.             print(f'У вас на счету {user.money} рубля(ей).\n')
  185.             continue
  186.         elif choise == '3':
  187.             cls()
  188.             user.send_money()
  189.             continue
  190.         elif choise == '4':
  191.             print('До свидания \n')
  192.             input('Нажите Enter для продолжения...')
  193.             cls()
  194.             break
  195.         elif choise == '5':
  196.             raise SystemExit('До свидания.')
  197.         else:
  198.             print('Выберите 1, 2, 3, 4 или 5')
  199.             continue
  200.         cls()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement