feat: добавлена функция назначения администраторов чатов
- Добавлено верхнее меню "Инструменты". - Реализован метод set_user_admin с вызовом API messages.setMemberRole. - Добавлена конвертация локального chat_id в peer_id (2000000000+id) для корректной работы метода. - Добавлены диалоги подтверждения и отчет о результатах выполнения.
This commit is contained in:
82
main.py
82
main.py
@@ -8,7 +8,7 @@ from PySide6.QtWidgets import (QApplication, QMainWindow, QLabel, QLineEdit,
|
|||||||
QTextBrowser, QScrollArea, QCheckBox, QHBoxLayout,
|
QTextBrowser, QScrollArea, QCheckBox, QHBoxLayout,
|
||||||
QSizePolicy, QDialog, QTextEdit, QTabWidget, QDialogButtonBox)
|
QSizePolicy, QDialog, QTextEdit, QTabWidget, QDialogButtonBox)
|
||||||
from PySide6.QtCore import Qt, QUrl, QDateTime, Signal, QTimer
|
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.QtWebEngineWidgets import QWebEngineView
|
||||||
from PySide6.QtWebEngineCore import QWebEnginePage, QWebEngineProfile
|
from PySide6.QtWebEngineCore import QWebEnginePage, QWebEngineProfile
|
||||||
from urllib.parse import urlparse, parse_qs, unquote
|
from urllib.parse import urlparse, parse_qs, unquote
|
||||||
@@ -351,6 +351,8 @@ class VkChatManager(QMainWindow):
|
|||||||
|
|
||||||
layout.addStretch(1)
|
layout.addStretch(1)
|
||||||
|
|
||||||
|
self.create_menu()
|
||||||
|
|
||||||
self.set_ui_state(False)
|
self.set_ui_state(False)
|
||||||
|
|
||||||
def on_vk_url_input_changed(self, text):
|
def on_vk_url_input_changed(self, text):
|
||||||
@@ -420,6 +422,19 @@ class VkChatManager(QMainWindow):
|
|||||||
self.status_label.setText(status_message)
|
self.status_label.setText(status_message)
|
||||||
self.set_ui_state(self.token is not None)
|
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):
|
def create_chat_tab(self):
|
||||||
# This implementation correctly creates a scrollable area for chat lists.
|
# This implementation correctly creates a scrollable area for chat lists.
|
||||||
tab_content_widget = QWidget()
|
tab_content_widget = QWidget()
|
||||||
@@ -705,6 +720,71 @@ class VkChatManager(QMainWindow):
|
|||||||
def add_user_to_chat(self):
|
def add_user_to_chat(self):
|
||||||
self._execute_user_action("add")
|
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__":
|
if __name__ == "__main__":
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|||||||
Reference in New Issue
Block a user