From 9bb52823072f111bb8e14031be3f2c2f7976e5f5 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 18 Sep 2023 14:26:42 +0300 Subject: [PATCH] fix-graph --- CHANGELOG.md | 13 ++-- bot/handlers/handle_members_change.py | 2 +- bot/handlers/handle_startup.py | 2 +- bot/main.py | 8 ++- bot/utils/graph.py | 94 +++++++++++++++------------ 5 files changed, 69 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 323f9ca..a71cec4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,13 @@ ## [0.0.12] + +- множество исправлений в роутинге сообщений - исправления в коммандах /ask и /my - исправление обработки случая без фото - добавлен автомат состояний - добавлена возможность высказаться "на кругу" без одобрения заявки - асинхронное api + ## [0.0.11] - отображение одобренности заявки на кнопке @@ -25,6 +28,7 @@ - исправлены ошибки - добавлена сервисная команда для показа потерянных заявок + ## [0.0.9] - исправление логики show_request_msg @@ -33,7 +37,8 @@ - kick для тех, от кого отказались поручители - bugfix: нестандартные символы в имени -## [0.0.8] + +## [0.0.8] - генерация древовидного графа, с опорой на одного участника - /my для просмотра и изменения связей @@ -55,7 +60,7 @@ - убраны кнопки ответов -## [0.0.5] +## [0.0.5] - добавлена возможность поручиться - обычные сообщения в общем чате больше никак не обрабатываются @@ -82,7 +87,7 @@ ## [0.0.2] -- добавлена функция для обратной связи +- добавлена функция для обратной связи - исправлена ошибка повторной регистрации хука ## [0.0.1] @@ -91,4 +96,4 @@ - настройки на основе переменных среды - функция приветственного сообщения с кнопками - ограничения для новоприбывших и неверно отвечающих -- распознание приветствия в тексте +- распознание приветствия в тексте diff --git a/bot/handlers/handle_members_change.py b/bot/handlers/handle_members_change.py index cb02be4..c74f93d 100644 --- a/bot/handlers/handle_members_change.py +++ b/bot/handlers/handle_members_change.py @@ -42,6 +42,6 @@ async def handle_left(msg): # удаление сообщения с кнопкой в этом чате prev_msg = storage.get(f"btn-{chat_id}-{member_id}") if prev_msg: - r = await delete_message(chat_id, prev_msg["id"]) + r = await delete_message(chat_id, prev_msg["message_id"]) logger.debug(r) storage.remove(f"btn-{chat_id}-{member_id}") diff --git a/bot/handlers/handle_startup.py b/bot/handlers/handle_startup.py index 7d7b14d..6d2d261 100644 --- a/bot/handlers/handle_startup.py +++ b/bot/handlers/handle_startup.py @@ -1,4 +1,4 @@ -from bot.config import FEEDBACK_CHAT_ID +from config import FEEDBACK_CHAT_ID from storage import scan, Profile from api import approve_chat_join_request, kick_member, send_message from handlers.callback_vouch import update_button diff --git a/bot/main.py b/bot/main.py index 20e4b33..17fe4f8 100644 --- a/bot/main.py +++ b/bot/main.py @@ -5,7 +5,8 @@ import signal # Import the signal module from aiogram import Bot, Dispatcher, Router from aiogram.enums import ParseMode from aiogram.filters import CommandStart, Command -from aiogram.types import Message, ChatJoinRequest, CallbackQuery, ChatMemberUpdated, ChatMemberLeft +from aiogram.types import Message, ChatJoinRequest, CallbackQuery, ChatMemberUpdated, ChatMemberLeft, ChatMemberBanned +from aiogram.enums import ChatMemberStatus from config import BOT_TOKEN from handlers.routing import handle_routing from handlers.callback_unlink import handle_unlink @@ -66,15 +67,16 @@ async def chat_members_change(update: ChatMemberUpdated): msg["chat"] = vars(update.chat) msg["from"] = vars(update.from_user) logger.debug(msg) - if update.old_chat_member == ChatMemberLeft: + if update.old_chat_member.status == ChatMemberStatus.KICKED: + # был забанен, удаляем все поручения await handle_left(msg) else: await handle_join(msg) async def main() -> None: + # connect router dp.include_router(router) - # storage revalidation await handle_startup() # Start event dispatching diff --git a/bot/utils/graph.py b/bot/utils/graph.py index 378add6..2b40254 100644 --- a/bot/utils/graph.py +++ b/bot/utils/graph.py @@ -1,3 +1,8 @@ + +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) + # Define SVG code generation function with member_id parameter def generate_chart(members, member_id=None): if not member_id: @@ -18,50 +23,57 @@ def generate_chart(members, member_id=None): descendants.add(member_id) break - stack = member["children"].copy() - while stack: - child_id = stack.pop() - descendants.add(child_id) + # calculate only if links are founded + if member: + stack = member["children"].copy() + while stack: + child_id = stack.pop() + descendants.add(child_id) + for m in members: + if m["id"] == child_id: + stack.extend(m["children"]) + break + + # Define the x position for each member + x_positions = {} + x_positions[member_id] = 0 + for i, m in enumerate(members): + if m["id"] in descendants: + x_positions[m["id"]] = (i * node_spacing) + node_radius + + # Start building the SVG code + svg_width = (len(descendants) * node_spacing) + (2 * node_radius) + svg_height = 200 + svg_code = f'' + + # Generate nodes and names for each descendant for m in members: - if m["id"] == child_id: - stack.extend(m["children"]) - break + if m["id"] in descendants: + node_x = x_positions[m["id"]] + node_code = f'' + name_code = f'{m["name"]}' + svg_code += node_code + name_code - # Define the x position for each member - x_positions = {} - x_positions[member_id] = 0 - for i, m in enumerate(members): - if m["id"] in descendants: - x_positions[m["id"]] = (i * node_spacing) + node_radius + # Generate links to parent nodes + for parent_id in m["parents"]: + if parent_id in descendants: + parent_x = x_positions[parent_id] + link_code = f'' + svg_code += link_code - # Start building the SVG code - svg_width = (len(descendants) * node_spacing) + (2 * node_radius) - svg_height = 200 - svg_code = f'' + # Generate links to child nodes + for child_id in m["children"]: + if child_id in descendants: + child_x = x_positions[child_id] + link_code = f'' + svg_code += link_code - # Generate nodes and names for each descendant - for m in members: - if m["id"] in descendants: - node_x = x_positions[m["id"]] - node_code = f'' - name_code = f'{m["name"]}' - svg_code += node_code + name_code + # Finish the SVG code + svg_code += "" - # Generate links to parent nodes - for parent_id in m["parents"]: - if parent_id in descendants: - parent_x = x_positions[parent_id] - link_code = f'' - svg_code += link_code + return svg_code.encode("utf-8") - # Generate links to child nodes - for child_id in m["children"]: - if child_id in descendants: - child_x = x_positions[child_id] - link_code = f'' - svg_code += link_code - - # Finish the SVG code - svg_code += "" - - return svg_code.encode("utf-8") + else: + logger.error(f"no connections in graph for {member_id}") + logger.debug(members) + return ""