diff --git a/bot/handlers/callback_unlink.py b/bot/handlers/callback_unlink.py index 7a3b4e2..8326ada 100644 --- a/bot/handlers/callback_unlink.py +++ b/bot/handlers/callback_unlink.py @@ -1,13 +1,17 @@ from api import send_message, delete_message, kick_member from handlers.command_my import handle_command_my +from handlers.callback_vouch import update_button from utils.mention import userdata_extract from storage import Profile +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) # remove link of callback sender # from member vouched before -async def handle_unlink(payload): - print("handle unlink button pressed or command, private chat only") +async def handle_unlink(payload, state): + logger.info("handle unlink button pressed or command, private chat only") from_id = str(payload["from"]["id"]) linked_id = "" @@ -29,7 +33,7 @@ async def handle_unlink(payload): # удаляем старое сообщение с кнопками-unlink reply_msg_id = payload["message"]["message_id"] r = await delete_message(from_id, reply_msg_id) - print(r) + logger.debug(r) # если ещё есть связи - посылаем новое сообщение if len(actor["children"]) > 0: @@ -40,7 +44,7 @@ async def handle_unlink(payload): # если больше никто не поручился - kick out if len(linked["parents"]) == 0: r = await kick_member(chat_id, linked_id) - print(r) + logger.debug(r) if r["ok"]: _, identity, username = userdata_extract(linked["result"]["user"]) body = ( @@ -49,7 +53,7 @@ async def handle_unlink(payload): else "Member %s%s was deleted" ) % (identity, username) r = await send_message(chat_id, body) - print(r) + logger.debug(r) # обновление счётчика - update_button(linked_id, chat_id) + await update_button(linked_id, chat_id) diff --git a/bot/handlers/callback_vouch.py b/bot/handlers/callback_vouch.py index b5ae6fb..eb9b9f1 100644 --- a/bot/handlers/callback_vouch.py +++ b/bot/handlers/callback_vouch.py @@ -7,6 +7,9 @@ from api import ( get_chat, ) from storage import Profile, storage +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) async def update_button(chat_id, member_id, text="❤️"): diff --git a/bot/handlers/command_ask.py b/bot/handlers/command_ask.py index 239a6a3..1614236 100644 --- a/bot/handlers/command_ask.py +++ b/bot/handlers/command_ask.py @@ -1,18 +1,21 @@ from storage import Profile from handlers.send_button import show_request_msg from api import get_member +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) async def handle_command_ask(msg): - print("handling request resend") + logger.info("handling request resend") _cmd, chat_id, member_id = msg["text"].split(" ") chat_id = chat_id.replace("-", "-100") r = await get_member(chat_id, member_id) - print(r) + logger.debug(r) m = {} if "result" in r: m["from"] = r["result"]["user"] m["chat"] = {"id": str(chat_id)} await show_request_msg(m) elif "error_code" in r: - print(r) + logger.error(r) diff --git a/bot/handlers/command_graph.py b/bot/handlers/command_graph.py index 49c30a1..f5a7112 100644 --- a/bot/handlers/command_graph.py +++ b/bot/handlers/command_graph.py @@ -9,4 +9,4 @@ async def handle_command_graph(msg): data = generate_chart(members) if data: r = await send_document(msg["chat"]["id"], data, "chart.svg") - print(r) + logger.debug(r) diff --git a/bot/handlers/command_my.py b/bot/handlers/command_my.py index fe720f1..82e50af 100644 --- a/bot/handlers/command_my.py +++ b/bot/handlers/command_my.py @@ -2,7 +2,9 @@ from storage import Profile, scan from api import get_member, send_message, get_chat_administrators from utils.mention import userdata_extract import json - +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) async def construct_unlink_buttons(actor): print(f"constructing unlink buttons for {actor['children']}") @@ -10,12 +12,13 @@ async def construct_unlink_buttons(actor): for vouch in actor["children"]: for chat_id in actor["chats"]: r = await get_member(chat_id, vouch) - print(r) - member = r["result"]["user"] - _uid, identity, username = userdata_extract(member) - buttons.append( - {"text": f"{identity} {username}", "callback_data": "unlink" + vouch} - ) + logger.debug(r) + if "result" in r: + member = r["result"]["user"] + _uid, identity, username = userdata_extract(member) + buttons.append( + {"text": f"{identity} {username}", "callback_data": "unlink" + vouch} + ) return buttons @@ -41,7 +44,7 @@ async def handle_command_my(msg, state): "Nobody recognized you? Speak, I will pass your message to the circle" ) r = await send_message(from_id, body) - print(r) + logger.debug(r) chat_id = msg["chat"]["id"] state.make_talking(from_id, chat_id) else: @@ -58,7 +61,7 @@ async def handle_command_owner_my(msg): chat_id = msg["chat"]["id"] if chat_id < 0: # is not private r = await get_chat_administrators(chat_id) - print(r) + logger.debug(r) owner_id = "" for admin in r["result"]: if admin["status"] == "creator": diff --git a/bot/handlers/handle_default.py b/bot/handlers/handle_default.py index b0273a9..7766e94 100644 --- a/bot/handlers/handle_default.py +++ b/bot/handlers/handle_default.py @@ -1,21 +1,24 @@ from api import send_message, delete_message, get_chat_administrators from storage import Profile, storage from handlers.send_button import show_request_msg +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) async def handle_default(msg): - print(f"default handler for all messages {msg}") + logger.info(f"default handler for all messages {msg}") chat_id = str(msg["chat"]["id"]) from_id = str(msg["from"]["id"]) sender = Profile.get(from_id, msg) text = msg.get("text", "") if text.startswith("/my"): # команда в групповом чате - print("remove some messages in group chat") + logger.info("remove some messages in group chat") # удалить сообщение с командой /my r = await delete_message(chat_id, msg["message_id"]) - print(r) + logger.debug(r) # показать новое сообщение с кнопкой # для дополнительного поручения @@ -24,9 +27,9 @@ async def handle_default(msg): # любое другое сообщение if len(sender["parents"]) == 0: # владелец чата автоматически ручается - print(f"setting owner as parent for {from_id}") + logger.info(f"setting owner as parent for {from_id}") r = await get_chat_administrators(chat_id) - print(r) + logger.debug(r) owner_id = "" for admin in r["result"]: if admin["status"] == "creator": diff --git a/bot/handlers/handle_feedback.py b/bot/handlers/handle_feedback.py index 93c5e90..5ffe4e2 100644 --- a/bot/handlers/handle_feedback.py +++ b/bot/handlers/handle_feedback.py @@ -10,6 +10,9 @@ from handlers.send_button import show_request_msg from utils.mention import userdata_extract from storage import storage, Profile from config import FEEDBACK_CHAT_ID +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) async def handle_feedback(msg, state): @@ -18,14 +21,14 @@ async def handle_feedback(msg, state): uid = msg["from"]["id"] if msg["text"] == "/start": r = await send_message(cid, "Напишите своё сообщение для администрации чата") - print(r) + logger.debug(r) elif state.is_talking(uid): r = await forward_message(cid, mid, state.talking[uid]) - print(r) + logger.debug(r) state.aho(uid) else: r = await forward_message(cid, mid, FEEDBACK_CHAT_ID) - print(r) + logger.debug(r) support_msg_id = r["result"]["message_id"] # сохранение айди сообщения в приватной переписке с ботом storage.set( @@ -39,7 +42,7 @@ async def handle_feedback(msg, state): async def handle_answer(msg): answered_msg = msg["reply_to_message"] r = await get_chat_administrators(msg["chat"]["id"]) - print(r) + logger.debug(r) admins = [] for a in r["result"]: admins.append(a["user"]["id"]) @@ -48,11 +51,11 @@ async def handle_answer(msg): # получение сохраненного информации о сообщении для ответа stored_feedback = storage.get(f"fbk-{support_msg_id}") if stored_feedback: - print("handle an answer from feedback group") + logger.info("handle an answer from feedback group") stored_feedback = json.loads(stored_feedback) r = await send_message( f'{stored_feedback["chat_id"]}', msg["text"], reply_to=stored_feedback["message_id"], ) - print(r) + logger.debug(r) diff --git a/bot/handlers/handle_join_request.py b/bot/handlers/handle_join_request.py index 4083c64..f46b6e4 100644 --- a/bot/handlers/handle_join_request.py +++ b/bot/handlers/handle_join_request.py @@ -2,9 +2,12 @@ from api import approve_chat_join_request, delete_message from handlers.send_button import show_request_msg from storage import Profile, storage +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) async def handle_join_request(msg): - print(f"handle join request {msg}") + logger.info(f"handle join request {msg}") chat_id = str(msg["chat"]["id"]) from_id = str(msg["from"]["id"]) actor = Profile.get(from_id, msg) @@ -15,5 +18,5 @@ async def handle_join_request(msg): else: # за пользователя поручились ранее r = await approve_chat_join_request(chat_id, from_id) - print(r) + logger.debug(r) Profile.save(actor) diff --git a/bot/handlers/handle_members_change.py b/bot/handlers/handle_members_change.py index b7ebe5d..cb02be4 100644 --- a/bot/handlers/handle_members_change.py +++ b/bot/handlers/handle_members_change.py @@ -3,6 +3,9 @@ from api import delete_message from storage import Profile, storage from config import FEEDBACK_CHAT_ID +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) async def handle_join(msg): chat_id = str(msg["chat"]["id"]) @@ -15,13 +18,13 @@ async def handle_join(msg): if len(actor["parents"]) == 0 and str(chat_id) != FEEDBACK_CHAT_ID: # показываем сообщение с кнопкой "поручиться" r = await show_request_msg(msg) - print(r) + logger.debug(r) else: # за пользователя поручились ранее pass else: # пользователи приглашены другим участником - print(f'{len(msg["new_chat_members"])} members were invited by {from_id}') + logger.info(f'{len(msg["new_chat_members"])} members were invited by {from_id}') for m in msg["new_chat_members"]: newcomer = Profile.get(m["id"]) newcomer["parents"].append(str(from_id)) @@ -32,7 +35,7 @@ async def handle_join(msg): async def handle_left(msg): - print("handling member leaving") + logger.info("handling member leaving") member_id = msg["left_chat_member"]["id"] chat_id = msg["chat"]["id"] @@ -40,5 +43,5 @@ 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"]) - print(r) + 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 283cdb1..8a81925 100644 --- a/bot/handlers/handle_startup.py +++ b/bot/handlers/handle_startup.py @@ -1,34 +1,38 @@ from storage import scan, Profile -from api import approve_chat_join_request, kick_member +from api import approve_chat_join_request, kick_member, send_message from handlers.callback_vouch import update_button from utils.mention import userdata_extract +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) # устанавливает соответствие данных -async def handle_startup(): +async def handle_startup(msg): btn_ids, _btns = scan(match="btn-*", count=100) for btnid in btn_ids: # для каждой ранее созданной кнопки btnid_str = btnid.decode("utf-8").replace("btn-", "") parts = btnid_str.split("-") - print(parts) + logger.debug(parts) _, chat_id, member_id = parts chat_id = "-" + chat_id newcomer = Profile.get(member_id) if len(newcomer.get("parents", [])) > 0: # принять заявку если её нажимали r = await approve_chat_join_request(chat_id, member_id) - print(r) - update_button(chat_id, member_id) + logger.debug(r) + await update_button(chat_id, member_id) elif len(newcomer.get("parents", [])) == 0: r = await kick_member(chat_id, member_id) - print(r) + logger.debug(r) if r["ok"]: _, identity, username = userdata_extract(newcomer["result"]["user"]) + lang = msg["from_user"]["lang"] body = ( "Участник %s%s был удалён" if lang == "ru" else "Member %s%s was deleted" ) % (identity, username) r = await send_message(chat_id, body) - print(r) + logger.debug(r) diff --git a/bot/handlers/routing.py b/bot/handlers/routing.py index 9e57b86..8eee954 100644 --- a/bot/handlers/routing.py +++ b/bot/handlers/routing.py @@ -6,23 +6,24 @@ from handlers.command_graph import handle_command_graph from handlers.command_ask import handle_command_ask from config import FEEDBACK_CHAT_ID +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) async def handle_routing(msg, state): cid = msg["chat"]["id"] uid = msg["from"]["id"] if cid == uid: # сообщения в личке с ботом - print("private chat message") + logger.info("private chat message") if msg["text"].startswith("/my"): await handle_command_my(msg, state) - elif msg["text"].startswith("/unlink"): - await handle_unlink(msg) else: await handle_feedback(msg, state) elif str(cid) == FEEDBACK_CHAT_ID: # сообщения из группы обратной связи - print("feedback chat message") + logger.info("feedback chat message") if "reply_to_message" in msg: await handle_answer(msg) elif msg["text"] == "/graph": @@ -32,7 +33,7 @@ async def handle_routing(msg, state): else: # сообщения из всех остальных групп - print(f"group {cid} chat message") + logger.info(f"group {cid} chat message") if "text" in msg: await handle_default(msg) elif "new_chat_member" in msg: diff --git a/bot/handlers/send_button.py b/bot/handlers/send_button.py index 68bcd31..2294a8e 100644 --- a/bot/handlers/send_button.py +++ b/bot/handlers/send_button.py @@ -1,10 +1,13 @@ -from api import send_message, send_photo, get_userphotos +from api import send_message, send_photo, get_userphotos, delete_message from utils.mention import mention, userdata_extract from storage import storage +import logging +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) async def show_request_msg(msg): - print("showing request with button") + logger.info("showing request with button") chat_id = str(msg["chat"]["id"]) from_id = str(msg["from"]["id"]) lang = msg["from"].get("language_code", "ru") @@ -17,12 +20,12 @@ async def show_request_msg(msg): else "There is a newcomer, press the button if you are connected with " ) r = await get_userphotos(user_id=from_id) - print(r) + logger.debug(r) if r["ok"] and r["result"]["total_count"] > 0: print("show button with photo") file_id = r["result"]["photos"][0][0]["file_id"] _uid, identity, username = userdata_extract(msg["from"]) - r = send_photo( + r = await send_photo( chat_id, file_id, caption=newcomer_message + f"{identity}{username}", @@ -30,21 +33,21 @@ async def show_request_msg(msg): reply_markup=reply_markup, ) else: - print("show button without photo") - r = send_message( + logger.info("show button without photo") + r = await send_message( chat_id, newcomer_message + mention(msg["from"]), reply_to=msg.get("message_id", ""), reply_markup=reply_markup, ) - print(r) + logger.debug(r) if "message_id" in r: # удаляем предыдущее сообщение с кнопкой в этом чате prevbtn = storage.get(f"btn-{chat_id}-{from_id}") if prevbtn: r = await delete_message(chat_id, prevbtn) - print(r) + logger.debug(r) # создаём новое newbtn = r["message_id"] - print(f"button message id: {newbtn}") + logger.info(f"button message id: {newbtn}") storage.set(f"btn-{chat_id}-{from_id}", newbtn) diff --git a/bot/main.py b/bot/main.py index 0642a41..12f1874 100644 --- a/bot/main.py +++ b/bot/main.py @@ -8,6 +8,9 @@ from aiogram.filters import CommandStart, Command from aiogram.types import Message, ChatJoinRequest, CallbackQuery from config import BOT_TOKEN, ADMIN_ID from handlers.routing import handle_routing +from handlers.callback_unlink import handle_unlink +from handlers.callback_vouch import handle_button +from handlers.handle_join_request import handle_join_request from state import State logger = logging.getLogger(__name__) @@ -28,7 +31,7 @@ async def process_callback(callback_query: CallbackQuery): if data.startswith("vouch"): await handle_button(cbq) elif data.startswith("unlink"): - await handle_unlink(cbq) + await handle_unlink(cbq, state) @router.chat_join_request() diff --git a/bot/storage/__init__.py b/bot/storage/__init__.py index 61142b6..71fcc12 100644 --- a/bot/storage/__init__.py +++ b/bot/storage/__init__.py @@ -28,9 +28,10 @@ def scan(match="usr-*", count=100): # Parse the JSON data from each value items = [] for value in values: - value_str = value.decode("utf-8") - i = json.loads(value_str) - items.append(i) + if value: + value_str = value.decode("utf-8") + i = json.loads(value_str) + items.append(i) print(f"scan found {len(items)} items") return keys, items