diff --git a/account_manager.py b/account_manager.py new file mode 100644 index 0000000..bb4824f --- /dev/null +++ b/account_manager.py @@ -0,0 +1,97 @@ +import os +from colorama import Fore, Style +import re + +# Define emoji constants +EMOJI = { + 'SUCCESS': '✅', + 'ERROR': '❌', + 'INFO': 'ℹ️' +} + +class AccountManager: + def __init__(self, translator=None): + self.translator = translator + self.accounts_file = 'cursor_accounts.txt' + + def save_account_info(self, email, password, token, total_usage): + """Save account information to file""" + try: + with open(self.accounts_file, 'a', encoding='utf-8') as f: + f.write(f"\n{'='*50}\n") + f.write(f"Email: {email}\n") + f.write(f"Password: {password}\n") + f.write(f"Token: {token}\n") + f.write(f"Usage Limit: {total_usage}\n") + f.write(f"{'='*50}\n") + + print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('register.account_info_saved') if self.translator else 'Account information saved'}...{Style.RESET_ALL}") + return True + + except Exception as e: + error_msg = self.translator.get('register.save_account_info_failed', error=str(e)) if self.translator else f'Failed to save account information: {str(e)}' + print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}") + return False + + def get_last_email_domain(self): + """Get the domain from the last used email""" + try: + if not os.path.exists(self.accounts_file): + return None + + # Only read the last 1KB of data from the file + with open(self.accounts_file, 'rb') as f: + # Get file size + f.seek(0, os.SEEK_END) + file_size = f.tell() + + if file_size == 0: + return None + + # Determine the number of bytes to read, maximum 1KB + read_size = min(1024, file_size) + + # Move to the appropriate position to start reading + f.seek(file_size - read_size) + + # Read the end data + data = f.read(read_size).decode('utf-8', errors='ignore') + + # Split by lines and search in reverse + lines = data.split('\n') + for line in reversed(lines): + if line.strip().startswith('Email:'): + email = line.split('Email:')[1].strip() + # Extract domain part (after @) + if '@' in email: + return email.split('@')[1] + return None + + # If no email is found in the last 1KB + return None + + except Exception as e: + error_msg = self.translator.get('account.get_last_email_domain_failed', error=str(e)) if self.translator else f'Failed to get the last used email domain: {str(e)}' + print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}") + return None + + def suggest_email(self, first_name, last_name): + """Generate a suggested email based on first and last name with the last used domain""" + try: + # Get the last used email domain + domain = self.get_last_email_domain() + if not domain: + return None + + # Generate email prefix from first and last name (lowercase) + email_prefix = f"{first_name.lower()}.{last_name.lower()}" + + # Combine prefix and domain + suggested_email = f"{email_prefix}@{domain}" + + return suggested_email + + except Exception as e: + error_msg = self.translator.get('account.suggest_email_failed', error=str(e)) if self.translator else f'Failed to suggest email: {str(e)}' + print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}") + return None diff --git a/cursor_register_manual.py b/cursor_register_manual.py index 2e2ddda..adf7a67 100644 --- a/cursor_register_manual.py +++ b/cursor_register_manual.py @@ -7,6 +7,7 @@ from cursor_auth import CursorAuth from reset_machine_manual import MachineIDResetter from get_user_token import get_token_from_cookie from config import get_config +from account_manager import AccountManager os.environ["PYTHONVERBOSE"] = "0" os.environ["PYINSTALLER_VERBOSE"] = "0" @@ -67,11 +68,28 @@ class CursorRegistration: def setup_email(self): """Setup Email""" try: - print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.manual_email_input') if self.translator else 'Please enter your email address:'}") - self.email_address = input().strip() + # Try to get a suggested email + account_manager = AccountManager(self.translator) + suggested_email = account_manager.suggest_email(self.first_name, self.last_name) + if suggested_email: + print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.suggest_email', suggested_email=suggested_email) if self.translator else f'Suggested email: {suggested_email}'}") + print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.use_suggested_email_or_enter') if self.translator else 'Type "yes" to use this email or enter your own email:'}") + user_input = input().strip() + + if user_input.lower() == 'yes' or user_input.lower() == 'y': + self.email_address = suggested_email + else: + # User input is their own email address + self.email_address = user_input + else: + # If there's no suggested email + print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.manual_email_input') if self.translator else 'Please enter your email address:'}") + self.email_address = input().strip() + + # Validate if the email is valid if '@' not in self.email_address: - print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_email') if self.translator else '无效的邮箱地址'}{Style.RESET_ALL}") + print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_email') if self.translator else 'Invalid email address'}{Style.RESET_ALL}") return False print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('register.email_address')}: {self.email_address}" + "\n" + f"{Style.RESET_ALL}") @@ -88,7 +106,7 @@ class CursorRegistration: code = input().strip() if not code.isdigit() or len(code) != 6: - print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_code') if self.translator else '无效的验证码'}{Style.RESET_ALL}") + print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_code') if self.translator else 'Invalid verification code'}{Style.RESET_ALL}") return None return code @@ -224,17 +242,12 @@ class CursorRegistration: if not resetter.reset_machine_ids(): # Call reset_machine_ids method directly raise Exception("Failed to reset machine ID") - # Save account information to file - with open('cursor_accounts.txt', 'a', encoding='utf-8') as f: - f.write(f"\n{'='*50}\n") - f.write(f"Email: {self.email_address}\n") - f.write(f"Password: {self.password}\n") - f.write(f"Token: {token}\n") - f.write(f"Usage Limit: {total_usage}\n") - f.write(f"{'='*50}\n") - - print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('register.account_info_saved')}...{Style.RESET_ALL}") - return True + # Save account information to file using AccountManager + account_manager = AccountManager(self.translator) + if account_manager.save_account_info(self.email_address, self.password, token, total_usage): + return True + else: + return False except Exception as e: print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.save_account_info_failed', error=str(e))}{Style.RESET_ALL}") diff --git a/locales/en.json b/locales/en.json index 87fbc49..40a557a 100644 --- a/locales/en.json +++ b/locales/en.json @@ -191,6 +191,8 @@ "setting_password": "Setting Password", "manual_code_input": "Manual Code Input", "manual_email_input": "Manual Email Input", + "suggest_email": "Suggested email: {suggested_email}", + "use_suggested_email_or_enter": "Type \"yes\" to use this email or enter your own email:", "password": "Password", "first_name": "First Name", "last_name": "Last Name", diff --git a/locales/zh_cn.json b/locales/zh_cn.json index 3af643f..32facac 100644 --- a/locales/zh_cn.json +++ b/locales/zh_cn.json @@ -191,6 +191,8 @@ "setting_password": "设置密码", "manual_code_input": "手动输入验证码", "manual_email_input": "手动输入邮箱", + "suggest_email": "推荐邮箱地址: {suggested_email}", + "use_suggested_email_or_enter": "输入\"yes\"使用此邮箱或直接输入您想使用的邮箱地址:", "password": "密码", "first_name": "名字", "last_name": "姓氏", diff --git a/locales/zh_tw.json b/locales/zh_tw.json index fe642d2..97c6fb6 100644 --- a/locales/zh_tw.json +++ b/locales/zh_tw.json @@ -188,6 +188,8 @@ "setting_password": "設置密碼", "manual_code_input": "手動輸入驗證碼", "manual_email_input": "手動輸入郵箱地址", + "suggest_email": "推薦郵箱地址: {suggested_email}", + "use_suggested_email_or_enter": "輸入\"yes\"使用此郵箱或直接輸入您想使用的郵箱地址:", "password": "密碼", "first_name": "名字", "last_name": "姓氏",