Помоги написать полностью приложения import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QLineEdit, QTextEdit, QComboBox, QListWidget
from PyQt5.QtGui import QIcon
from telegram.ext import Updater, CommandHandler, MessageHandler
import logging
import time

class TelegramApp(QWidget):
    def __init__(self):
        super().__init__()
        self.accounts = []  # Список для хранения аккаунтов
        self.initUI()

    def initUI(self):
        # Создание основных компонентов интерфейса
        self.tabs = QTabWidget()
        self.accounts_tab = QWidget()
        self.send_tab = QWidget()
        self.invite_tab = QWidget()
        self.parse_tab = QWidget()

        # Добавление вкладок
        self.tabs.addTab(self.accounts_tab, "Аккаунты")
        self.tabs.addTab(self.send_tab, "Рассылка")
        self.tabs.addTab(self.invite_tab, "Инвайт")
        self.tabs.addTab(self.parse_tab, "Парсинг")

        # Добавление компонентов для вкладки "Аккаунты"
        self.accounts_layout = QVBoxLayout()
        self.add_account_button = QPushButton("Добавить аккаунт")
        self.account_list = QListWidget()
        self.accounts_layout.addWidget(self.add_account_button)
        self.accounts_layout.addWidget(self.account_list)
        self.accounts_tab.setLayout(self.accounts_layout)

        # Добавление компонентов для вкладки "Рассылка"
        self.send_layout = QVBoxLayout()
        self.send_options = QComboBox()
        self.send_options.addItems(["Рассылка по группам", "Рассылка по пользователям", "Рассылка по комментариям в каналах"])
        self.send_text = QTextEdit()
        self.send_button = QPushButton("Отправить")
        self.accounts_list = QListWidget()
        self.groups_edit = QTextEdit()
        self.users_edit = QTextEdit()
        self.channels_edit = QTextEdit()
        self.interval_edit = QLineEdit()
        self.send_layout.addWidget(self.send_options)
        self.send_layout.addWidget(self.send_text)
        self.send_layout.addWidget(self.accounts_list)
        self.send_layout.addWidget(self.groups_edit)
        self.send_layout.addWidget(self.users_edit)
        self.send_layout.addWidget(self.channels_edit)
        self.send_layout.addWidget(self.interval_edit)
        self.send_layout.addWidget(self.send_button)
        self.send_tab.setLayout(self.send_layout)

        # Добавление компонентов для вкладки "Инвайт"
        self.invite_layout = QVBoxLayout()
        self.invite_button = QPushButton("Отправить приглашение")
        self.invite_text = QTextEdit()
        self.invite_layout.addWidget(self.invite_button)
        self.invite_layout.addWidget(self.invite_text)
        self.invite_tab.setLayout(self.invite_layout)

        # Добавление компонентов для вкладки "Парсинг"
        self.parse_layout = QVBoxLayout()
        self.parse_button = QPushButton("Парсить")
        self.parse_text = QTextEdit()
        self.parse_layout.addWidget(self.parse_button)
        self.parse_layout.addWidget(self.parse_text)
        self.parse_tab.setLayout(self.parse_layout)

        # Связываем кнопку добавления аккаунта с функцией add_account
        self.add_account_button.clicked.connect(self.add_account)

        # Связываем кнопку "Отправить" с функцией send_message
        self.send_button.clicked.connect(self.send_message)

        # Связываем кнопку "Отправить приглашение" с функцией send_invite
        self.invite_button.clicked.connect(self.send_invite)

        # Связываем кнопку "Парсить" с функцией parse_text
        self.parse_button.clicked.connect(self.parse_text)

    def add_account(self):
        # Создаем новое окно для ввода данных аккаунта
        dialog = AccountInputDialog(self)
        if dialog.exec_():
            # Получаем данные аккаунта из диалогового окна
            username = dialog.username_edit.text()
            api_id = dialog.api_id_edit.text()
            api_hash = dialog.api_hash_edit.text()

            # Сохраняем данные нового аккаунта в список
            self.accounts.append((username, api_id, api_hash))

            # Отображаем список аккаунтов в интерфейсе
            self.account_list.addItem(username)

    def send_message(self):
        variant = self.send_options.currentText()
        text = self.send_text.toPlainText()
        accounts = self.accounts  # Доступ к списку аккаунтов из первого фрагмента
        interval = int(self.interval_edit.text())

        for account in accounts:
            client = TelegramClient(account, api_id, api_hash)
            client.start()

            if variant == "Рассылка по группам":
                groups = self.groups_edit.toPlainText().split('\n')
                for group in groups:
                    client.send_message(InputPeerChannel(group), text)
                    time.sleep(interval)
            elif variant == "Рассылка по пользователям":
                users = self.users_edit.toPlainText().split('\n')
                for user in users:
                    client.send_message(InputPeerUser(user), text)
                    time.sleep(interval)
            elif variant == "Рассылка по комментариям в каналах":
                channels = self.channels_edit.toPlainText().split('\n')
                for channel in channels:
                    comments = client.get_messages(InputPeerChannel(channel), limit=100)
                    for comment in comments:
                        client.send_message(InputPeerChannel(channel), reply_to=comment.id, text=text)
                        time.sleep(interval)

        # Отображение уведомления
        QMessageBox.information(self, "Рассылка", "Сообщения успешно отправлены!")

    def send_invite(self):
        text = self.invite_text.toPlainText()
        accounts = self.accounts  # Доступ к списку аккаунтов из первого фрагмента

        for account in accounts:
            client = TelegramClient(account, api_id, api_hash)
            client.start()

            client.send_message(InputPeerUser(self.invite_text.toPlainText()), text)

        QMessageBox.information(self, "Приглашение", "Приглашение отправлено!")

    def parse_text(self):
        text = self.parse_text.to