Advertisement
KosmosilaBY

Untitled

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