From f67db33628e9955be9ea240389cb42e1d019ae1a Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Sun, 11 Jan 2026 02:15:18 +0000 Subject: [PATCH] Refactor KeyGeneratorTab and EmailParserTab to improve input validation and error handling --- __pycache__/registration_gui.cpython-314.pyc | Bin 0 -> 36673 bytes registration_gui.py | 195 ++++++++++++++----- 2 files changed, 141 insertions(+), 54 deletions(-) create mode 100644 __pycache__/registration_gui.cpython-314.pyc diff --git a/__pycache__/registration_gui.cpython-314.pyc b/__pycache__/registration_gui.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2fb5e53ca6fb0d4f2917d2a0f133837bfe7bebc GIT binary patch literal 36673 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 literal 0 HcmV?d00001 diff --git a/registration_gui.py b/registration_gui.py index 1db935b7..2e0096bf 100644 --- a/registration_gui.py +++ b/registration_gui.py @@ -262,8 +262,7 @@ class KeyGeneratorTab(QWidget): validate_btn.clicked.connect(self.validate_key) button_layout.addWidget(validate_btn) - layout.addLayout(button_layoutself.generate_key) - layout.addWidget(generate_btn) + layout.addLayout(button_layout) # Output group output_group = QGroupBox("Generated Registration Key") @@ -291,6 +290,30 @@ class KeyGeneratorTab(QWidget): try: # Get input values values = {key: widget.text().strip() for key, widget in self.inputs.items()} + + # Validate inputs + if not all(values.values()): + QMessageBox.warning(self, "Missing Input", "Please fill in all fields.") + return + + # Generate key + key = self.generator_func(**values) + + if key: + self.output.setPlainText(key) + self.output.setStyleSheet("background-color: #e8f5e9; color: #2e7d32;") + else: + QMessageBox.error(self, "Generation Failed", "Failed to generate registration key.") + + except Exception as e: + QMessageBox.critical(self, "Error", f"An error occurred: {str(e)}") + + def copy_to_clipboard(self): + """Copy the generated key to clipboard""" + text = self.output.toPlainText() + if text: + QApplication.clipboard().setText(text) + QMessageBox.information(self, "Copied", "Registration key copied to clipboard!") def validate_key(self): """Validate a registration key (mimics Java validation logic)""" @@ -357,30 +380,6 @@ class KeyGeneratorTab(QWidget): except Exception as e: QMessageBox.critical(self, "Validation Error", f"An error occurred during validation: {str(e)}") - - # Validate inputs - if not all(values.values()): - QMessageBox.warning(self, "Missing Input", "Please fill in all fields.") - return - - # Generate key - key = self.generator_func(**values) - - if key: - self.output.setPlainText(key) - self.output.setStyleSheet("background-color: #e8f5e9; color: #2e7d32;") - else: - QMessageBox.error(self, "Generation Failed", "Failed to generate registration key.") - - except Exception as e: - QMessageBox.critical(self, "Error", f"An error occurred: {str(e)}") - - def copy_to_clipboard(self): - """Copy the generated key to clipboard""" - text = self.output.toPlainText() - if text: - QApplication.clipboard().setText(text) - QMessageBox.information(self, "Copied", "Registration key copied to clipboard!") class EmailParserTab(QWidget): @@ -407,33 +406,10 @@ class EmailParserTab(QWidget): layout.addWidget(instructions) # Input area - inButton layout - button_layout = QHBoxLayout() + input_group = QGroupBox("Paste Registration Email Here") + input_layout = QVBoxLayout() - # Copy button - copy_btn = QPushButton("Copy Registration Key") - copy_btn.clicked.connect(self.copy_key) - button_layout.addWidget(copy_btn) - - # Validate button - validate_btn = QPushButton("Validate Key") - validate_btn.setStyleSheet(""" - QPushButton { - background-color: #FF9800; - color: white; - padding: 8px; - font-size: 13px; - font-weight: bold; - border-radius: 3px; - } - QPushButton:hover { - background-color: #F57C00; - } - """) - validate_btn.clicked.connect(self.validate_parsed_key) - button_layout.addWidget(validate_btn) - - layout.addLayout(button_layoutit() + self.email_text = QTextEdit() self.email_text.setPlaceholderText( "[Registration]\n" "First Name: John\n" @@ -496,8 +472,120 @@ class EmailParserTab(QWidget): output_group.setLayout(output_layout) layout.addWidget(output_group) + # Button layout + button_layout = QHBoxLayout() + # Copy button copy_btn = QPushButton("Copy Registration Key") + copy_btn.clicked.connect(self.copy_key) + button_layout.addWidget(copy_btn) + + # Validate button + validate_btn = QPushButton("Validate Key") + validate_btn.setStyleSheet(""" + QPushButton { + background-color: #FF9800; + color: white; + padding: 8px; + font-size: 13px; + font-weight: bold; + border-radius: 3px; + } + QPushButton:hover { + background-color: #F57C00; + } + """) + validate_btn.clicked.connect(self.validate_parsed_key) + button_layout.addWidget(validate_btn) + + layout.addLayout(button_layout) + + layout.addStretch() + self.setLayout(layout) + + def parse_email(self): + """Parse registration information from email text""" + text = self.email_text.toPlainText() + + if not text.strip(): + QMessageBox.warning(self, "Empty Input", "Please paste the registration email text.") + return + + try: + # Parse the email text + in_registration = False + first_name = "" + last_name = "" + email = "" + serial = "" + reg_key = "" + + for line in text.split('\n'): + line = line.strip() + + if '[Registration]' in line or line.startswith('Registration'): + in_registration = True + continue + + if '[End Registration]' in line or not in_registration: + if '[End Registration]' in line: + break + continue + + if in_registration: + # Parse different fields + if line.startswith('First Name') and ':' in line: + first_name = line.split(':', 1)[1].strip() + elif line.startswith('Last Name') and ':' in line: + last_name = line.split(':', 1)[1].strip() + elif 'email' in line.lower() and ':' in line: + email = line.split(':', 1)[1].strip() + elif 'Serial Number' in line and ':' in line: + serial = line.split(':', 1)[1].strip() + elif 'Registration Key' in line and ':' in line: + key_part = line.split(':', 1)[1].strip() + reg_key = key_part if key_part else reg_key + elif reg_key and line and not ':' in line: + # Continue multi-line registration key + reg_key += line.strip() + + # Update output fields + self.first_name_output.setText(first_name) + self.last_name_output.setText(last_name) + self.email_output.setText(email) + self.serial_output.setText(serial) + self.key_output.setPlainText(reg_key) + + if first_name or last_name or email or reg_key: + self.key_output.setStyleSheet("background-color: #e8f5e9; color: #2e7d32;") + QMessageBox.information( + self, + "Success", + "Registration information parsed successfully!" + ) + else: + QMessageBox.warning( + self, + "No Data Found", + "Could not find registration information in the pasted text.\n\n" + "Make sure the text contains fields like:\n" + "First Name: ...\n" + "Last Name: ...\n" + "Registered email: ...\n" + "Registration Key: ..." + ) + + except Exception as e: + QMessageBox.critical(self, "Parse Error", f"Error parsing email: {str(e)}") + + def copy_key(self): + """Copy registration key to clipboard""" + key = self.key_output.toPlainText() + if key: + QApplication.clipboard().setText(key) + QMessageBox.information(self, "Copied", "Registration key copied to clipboard!") + else: + QMessageBox.warning(self, "No Key", "No registration key to copy.") def validate_parsed_key(self): """Validate the parsed registration key""" @@ -631,8 +719,7 @@ class EmailParserTab(QWidget): if in_registration: # Parse different fields if line.startswith('First Name') and ':' in line: - first_name = line.split(':', 1), - supports_validation=False # Obfuscation only, no key validation[1].strip() + first_name = line.split(':', 1)[1].strip() elif line.startswith('Last Name') and ':' in line: last_name = line.split(':', 1)[1].strip() elif 'email' in line.lower() and ':' in line: