From e97d3466824f68be4f396636a68e2b1090e12e28 Mon Sep 17 00:00:00 2001 From: benya Date: Thu, 22 Jan 2026 12:55:49 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=B8=D1=81=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D1=87=D0=B0=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлено верхнее меню "Инструменты". - Реализован метод set_user_admin с вызовом API messages.setMemberRole. - Добавлена конвертация локального chat_id в peer_id (2000000000+id) для корректной работы метода. - Добавлены диалоги подтверждения и отчет о результатах выполнения. --- main.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index ab87f19..83fa480 100644 --- a/main.py +++ b/main.py @@ -8,7 +8,7 @@ from PySide6.QtWidgets import (QApplication, QMainWindow, QLabel, QLineEdit, QTextBrowser, QScrollArea, QCheckBox, QHBoxLayout, QSizePolicy, QDialog, QTextEdit, QTabWidget, QDialogButtonBox) from PySide6.QtCore import Qt, QUrl, QDateTime, Signal, QTimer -from PySide6.QtGui import QIcon +from PySide6.QtGui import QIcon, QAction from PySide6.QtWebEngineWidgets import QWebEngineView from PySide6.QtWebEngineCore import QWebEnginePage, QWebEngineProfile from urllib.parse import urlparse, parse_qs, unquote @@ -351,6 +351,8 @@ class VkChatManager(QMainWindow): layout.addStretch(1) + self.create_menu() + self.set_ui_state(False) def on_vk_url_input_changed(self, text): @@ -420,6 +422,19 @@ class VkChatManager(QMainWindow): self.status_label.setText(status_message) self.set_ui_state(self.token is not None) + def create_menu(self): + """Создает верхнее меню.""" + menu_bar = self.menuBar() + + # Меню "Инструменты" + tools_menu = menu_bar.addMenu("Инструменты") + + # Действие "Назначить администратором" + make_admin_action = QAction("Назначить администратором", self) + make_admin_action.setStatusTip("Назначить выбранных пользователей администраторами в выбранных чатах") + make_admin_action.triggered.connect(self.set_user_admin) + tools_menu.addAction(make_admin_action) + def create_chat_tab(self): # This implementation correctly creates a scrollable area for chat lists. tab_content_widget = QWidget() @@ -705,6 +720,71 @@ class VkChatManager(QMainWindow): def add_user_to_chat(self): self._execute_user_action("add") + def set_user_admin(self): + """Назначает пользователя администратором чата.""" + # 1. Проверки на наличие выбранных пользователей и чатов + if not self.user_ids_to_process: + QMessageBox.warning(self, "Ошибка", "Нет ID пользователей для операции.") + return + + selected_chats = self._get_selected_chats() + if not selected_chats: + QMessageBox.warning(self, "Ошибка", "Выберите хотя бы один чат.") + return + + # 2. Подготовка данных для подтверждения + user_infos = {uid: self.get_user_info_by_id(uid) for uid in self.user_ids_to_process} + user_names_str = "\n".join([f"• {name}" for name in user_infos.values()]) + + msg = ( + f"Вы уверены, что хотите назначить АДМИНИСТРАТОРАМИ следующих пользователей:\n\n" + f"{user_names_str}\n\n" + f"в {len(selected_chats)} выбранных чатах?" + ) + + # 3. Диалог подтверждения + confirm_dialog = QMessageBox(self) + confirm_dialog.setWindowTitle("Подтверждение прав") + confirm_dialog.setText(msg) + confirm_dialog.setIcon(QMessageBox.Question) + yes_button = confirm_dialog.addButton("Да", QMessageBox.YesRole) + no_button = confirm_dialog.addButton("Нет", QMessageBox.NoRole) + confirm_dialog.setDefaultButton(no_button) + + confirm_dialog.exec() + + if confirm_dialog.clickedButton() != yes_button: + return + + # 4. Выполнение API запросов + results = [] + for chat in selected_chats: + # VK API требует peer_id. Для чатов это 2000000000 + local_id + try: + peer_id = 2000000000 + int(chat['id']) + except ValueError: + results.append(f"✗ Ошибка ID чата: {chat['id']}") + continue + + for user_id, user_info in user_infos.items(): + try: + self.vk.messages.setMemberRole( + peer_id=peer_id, + member_id=user_id, + role="admin" + ) + results.append(f"✓ '{user_info}' назначен админом в '{chat['title']}'.") + except VkApiError as e: + results.append(f"✗ Ошибка для '{user_info}' в '{chat['title']}': {e}") + + # 5. Вывод результата + QMessageBox.information(self, "Результаты назначения", "\n".join(results)) + + # Очистка полей (по желанию, можно убрать эти две строки, если хотите оставить ввод) + self.vk_url_input.clear() + self.user_ids_to_process.clear() + self.set_ui_state(self.token is not None) + if __name__ == "__main__": app = QApplication(sys.argv)