""" Facebook-spezifischer Generator-Tab mit Geschlechtsauswahl. """ import logging import random from PyQt5.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel, QLineEdit, QSpinBox, QPushButton, QGroupBox, QRadioButton, QButtonGroup, QProgressBar ) from PyQt5.QtCore import pyqtSignal, Qt logger = logging.getLogger("facebook_generator_tab") class FacebookGeneratorTab(QWidget): """ Facebook-spezifischer Generator-Tab mit Geschlechtsauswahl. """ # Signale start_requested = pyqtSignal(dict) stop_requested = pyqtSignal() account_created = pyqtSignal(str, dict) # (platform, account_data) def __init__(self, platform_name, language_manager=None): super().__init__() self.platform_name = platform_name self.language_manager = language_manager self.init_ui() if self.language_manager: self.language_manager.language_changed.connect(self.update_texts) self.update_texts() def init_ui(self): """Initialisiert die UI mit Facebook-spezifischen Feldern.""" layout = QVBoxLayout(self) layout.setContentsMargins(20, 20, 20, 20) layout.setSpacing(20) # Formular-Gruppe self.form_group = QGroupBox("Account-Informationen") grid_layout = QGridLayout() grid_layout.setHorizontalSpacing(15) grid_layout.setVerticalSpacing(10) self.form_group.setLayout(grid_layout) # Zeile 0: Vorname und Nachname self.first_name_label = QLabel("Vorname:") self.first_name_input = QLineEdit() self.first_name_input.setPlaceholderText("Max") self.last_name_label = QLabel("Nachname:") self.last_name_input = QLineEdit() self.last_name_input.setPlaceholderText("Mustermann") grid_layout.addWidget(self.first_name_label, 0, 0) grid_layout.addWidget(self.first_name_input, 0, 1) grid_layout.addWidget(self.last_name_label, 0, 2) grid_layout.addWidget(self.last_name_input, 0, 3) # Zeile 1: Alter self.age_label = QLabel("Alter:") self.age_input = QLineEdit() self.age_input.setMaximumWidth(100) grid_layout.addWidget(self.age_label, 1, 0) grid_layout.addWidget(self.age_input, 1, 1) # Zeile 2: Geschlecht self.gender_label = QLabel("Geschlecht:") # Geschlechts-Widget gender_widget = QWidget() gender_layout = QHBoxLayout(gender_widget) gender_layout.setContentsMargins(0, 0, 0, 0) # Radio Buttons self.gender_male = QRadioButton("Männlich") self.gender_female = QRadioButton("Weiblich") self.gender_custom = QRadioButton("Divers") # Standard: Weiblich self.gender_female.setChecked(True) # Button Group für exklusive Auswahl self.gender_group = QButtonGroup() self.gender_group.addButton(self.gender_male, 1) self.gender_group.addButton(self.gender_female, 2) self.gender_group.addButton(self.gender_custom, 3) # Füge Radio Buttons zum Layout gender_layout.addWidget(self.gender_male) gender_layout.addWidget(self.gender_female) gender_layout.addWidget(self.gender_custom) gender_layout.addStretch() grid_layout.addWidget(self.gender_label, 2, 0) grid_layout.addWidget(gender_widget, 2, 1, 1, 3) layout.addWidget(self.form_group) # Fortschrittsanzeige self.progress_bar = QProgressBar() self.progress_bar.setRange(0, 100) self.progress_bar.setValue(0) self.progress_bar.setMaximumHeight(20) self.progress_bar.setMinimumWidth(300) self.progress_bar.hide() # Versteckt bis zur Nutzung layout.addWidget(self.progress_bar) # Buttons button_layout = QHBoxLayout() button_layout.addStretch() self.start_button = QPushButton("Account erstellen") self.start_button.setMinimumWidth(150) self.start_button.clicked.connect(self.on_start_clicked) self.stop_button = QPushButton("Abbrechen") self.stop_button.setMinimumWidth(150) self.stop_button.clicked.connect(self.on_stop_clicked) self.stop_button.setEnabled(False) button_layout.addWidget(self.start_button) button_layout.addWidget(self.stop_button) layout.addLayout(button_layout) # Spacer am Ende layout.addStretch() def get_params(self): """Sammelt alle Parameter für die Account-Erstellung.""" # Namen sammeln first_name = self.first_name_input.text().strip() last_name = self.last_name_input.text().strip() full_name = f"{first_name} {last_name}" # Alter verarbeiten age_text = self.age_input.text().strip() age = self.parse_age(age_text) # Geschlecht bestimmen gender = self.get_selected_gender() params = { "first_name": first_name, "last_name": last_name, "full_name": full_name, "age": age, "age_text": age_text, "gender": gender, "registration_method": "email", "headless": False, "debug": True, "email_domain": "z5m7q9dk3ah2v1plx6ju.com" } logger.debug(f"Facebook Formulardaten: {params}") return params def parse_age(self, age_text): """Parst den Alters-Text und gibt ein numerisches Alter zurück.""" if not age_text: return random.randint(18, 65) # Versuche Range zu parsen (z.B. "18-25") if '-' in age_text: try: min_age, max_age = age_text.split('-') min_age = int(min_age.strip()) max_age = int(max_age.strip()) return random.randint(min_age, max_age) except: pass # Versuche als einzelne Zahl try: return int(age_text) except: return random.randint(18, 65) def get_selected_gender(self): """Gibt das ausgewählte Geschlecht zurück.""" if self.gender_group: checked_button = self.gender_group.checkedButton() if checked_button: gender_id = self.gender_group.id(checked_button) if gender_id == 1: return 'male' elif gender_id == 2: return 'female' else: return 'custom' # Fallback: zufällige Auswahl return random.choice(['male', 'female']) def validate_inputs(self, params): """Validiert die Eingaben.""" # Name prüfen if not params.get('first_name') or not params.get('last_name'): return False, "Vor- und Nachname sind erforderlich" # Alter prüfen age = params.get('age', 0) if age < 13: return False, "Mindestalter für Facebook ist 13 Jahre" if age > 100: return False, "Bitte geben Sie ein realistisches Alter ein" return True, None def on_start_clicked(self): """Behandelt den Start-Button-Klick.""" # Parameter sammeln params = self.get_params() # Validierung valid, error_msg = self.validate_inputs(params) if not valid: self.show_error(error_msg) return # Status aktualisieren self.set_status("Starte Account-Erstellung...") # Signal senden self.start_requested.emit(params) def on_stop_clicked(self): """Behandelt den Stop-Button-Klick.""" self.stop_requested.emit() def set_running(self, running: bool): """Setzt den Status auf 'Wird ausgeführt' oder 'Bereit'.""" self.start_button.setEnabled(not running) self.stop_button.setEnabled(running) if running: self.set_status("Läuft...") else: self.progress_bar.setValue(0) self.progress_bar.hide() def set_progress(self, value: int): """Setzt den Fortschritt der Fortschrittsanzeige.""" if value > 0: self.progress_bar.show() self.progress_bar.setValue(value) if value >= 100: self.progress_bar.hide() def show_error(self, message: str): """Zeigt eine Fehlermeldung an.""" title = "Fehler" if self.language_manager: title = self.language_manager.get_text( "generator_tab.error_title", "Fehler" ) from views.widgets.modern_message_box import show_error show_error(self, title, message) self.set_status("Fehler aufgetreten") def show_success(self, message: str): """Zeigt eine Erfolgsmeldung an.""" title = "Erfolg" if self.language_manager: title = self.language_manager.get_text( "generator_tab.success_title", "Erfolg" ) from views.widgets.modern_message_box import show_success show_success(self, title, message) self.set_status("Erfolgreich abgeschlossen") # Kompatibilitätsmethoden für bestehenden Code def clear_log(self): """Kompatibilitätsmethode - tut nichts, da kein Log vorhanden.""" pass def add_log(self, message: str): """Kompatibilitätsmethode - gibt an die Konsole aus.""" logger.info(message) def store_created_account(self, result_data: dict): """Speichert die erstellten Account-Daten.""" if "account_data" in result_data: self.account_created.emit(self.platform_name, result_data["account_data"]) def set_status(self, message): """Setzt den Status-Text.""" # Status-Label wurde entfernt - Log to console for debugging logger.info(f"Status: {message}") def update_texts(self): """Aktualisiert die Texte nach Sprachwechsel.""" if not self.language_manager: return # Labels self.first_name_label.setText( self.language_manager.get_text("generator.first_name", "Vorname") + ":" ) self.last_name_label.setText( self.language_manager.get_text("generator.last_name", "Nachname") + ":" ) self.age_label.setText( self.language_manager.get_text("generator.age", "Alter") + ":" ) self.gender_label.setText( self.language_manager.get_text("generator.gender", "Geschlecht") + ":" ) # Radio Buttons self.gender_male.setText( self.language_manager.get_text("generator.gender_male", "Männlich") ) self.gender_female.setText( self.language_manager.get_text("generator.gender_female", "Weiblich") ) self.gender_custom.setText( self.language_manager.get_text("generator.gender_custom", "Divers") ) # Buttons self.start_button.setText( self.language_manager.get_text("buttons.create", "Account erstellen") ) self.stop_button.setText( self.language_manager.get_text("buttons.cancel", "Abbrechen") ) # GroupBox self.form_group.setTitle( self.language_manager.get_text("generator_tab.form_title", "Account-Informationen") )