fix-graph
This commit is contained in:
parent
19d0984466
commit
9bb5282307
13
CHANGELOG.md
13
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 @@
|
|||
- настройки на основе переменных среды
|
||||
- функция приветственного сообщения с кнопками
|
||||
- ограничения для новоприбывших и неверно отвечающих
|
||||
- распознание приветствия в тексте
|
||||
- распознание приветствия в тексте
|
||||
|
|
|
@ -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}")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'<svg width="{svg_width}" height="{svg_height}">'
|
||||
|
||||
# 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'<circle cx="{node_x}" cy="{node_y}" r="{node_radius}" stroke="black" stroke-width="2" fill="white"/>'
|
||||
name_code = f'<text x="{node_x}" y="{node_y}" font-size="16" text-anchor="middle">{m["name"]}</text>'
|
||||
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'<line x1="{node_x}" y1="{node_y - parent_y_offset}" x2="{parent_x}" y2="{node_y}" stroke="black" stroke-width="2"/>'
|
||||
svg_code += link_code
|
||||
|
||||
# Start building the SVG code
|
||||
svg_width = (len(descendants) * node_spacing) + (2 * node_radius)
|
||||
svg_height = 200
|
||||
svg_code = f'<svg width="{svg_width}" height="{svg_height}">'
|
||||
# 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'<line x1="{node_x}" y1="{node_y + child_y_offset}" x2="{child_x}" y2="{node_y}" stroke="black" stroke-width="2"/>'
|
||||
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'<circle cx="{node_x}" cy="{node_y}" r="{node_radius}" stroke="black" stroke-width="2" fill="white"/>'
|
||||
name_code = f'<text x="{node_x}" y="{node_y}" font-size="16" text-anchor="middle">{m["name"]}</text>'
|
||||
svg_code += node_code + name_code
|
||||
# Finish the SVG code
|
||||
svg_code += "</svg>"
|
||||
|
||||
# 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'<line x1="{node_x}" y1="{node_y - parent_y_offset}" x2="{parent_x}" y2="{node_y}" stroke="black" stroke-width="2"/>'
|
||||
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'<line x1="{node_x}" y1="{node_y + child_y_offset}" x2="{child_x}" y2="{node_y}" stroke="black" stroke-width="2"/>'
|
||||
svg_code += link_code
|
||||
|
||||
# Finish the SVG code
|
||||
svg_code += "</svg>"
|
||||
|
||||
return svg_code.encode("utf-8")
|
||||
else:
|
||||
logger.error(f"no connections in graph for {member_id}")
|
||||
logger.debug(members)
|
||||
return ""
|
||||
|
|
Loading…
Reference in New Issue
Block a user