diff --git a/CHANGELOG.md b/CHANGELOG.md index aef7a61..dd248ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ - исправлен kick/approve на старте - сообщение во все чаты, если отменили все одобрения - ответы учитываются только от админов FEEDBACK-чата +- логика целостности данных для связей +- команда /unlink по внутреннему айди ## [0.0.10] diff --git a/api/webhook.py b/api/webhook.py index 1b4fda9..53330b7 100644 --- a/api/webhook.py +++ b/api/webhook.py @@ -48,6 +48,8 @@ async def handle(req): print('private chat message') if msg['text'].startswith('/my'): handle_command_my(msg) + elif msg['text'].startswith('/unlink'): + handle_unlink(msg) else: handle_feedback(msg) elif str(msg['chat']['id']) == FEEDBACK_CHAT_ID: diff --git a/tgbot/handlers/callback_unlink.py b/tgbot/handlers/callback_unlink.py index 9fa1e08..2260ea8 100644 --- a/tgbot/handlers/callback_unlink.py +++ b/tgbot/handlers/callback_unlink.py @@ -5,34 +5,38 @@ from tgbot.storage import Profile # remove link of callback sender # from member vouched before -def handle_unlink(callback_query): - print('handle unlink button pressed, private chat only') +def handle_unlink(payload): + print('handle unlink button pressed or command, private chat only') - from_id = str(callback_query['from']['id']) - linked_id = str(callback_query['data'].replace('unlink', '')) + from_id = str(payload['from']['id']) + linked_id = '' + if 'data' in payload: + linked_id = str(payload['data'].replace('unlink', '')) + elif 'text' in payload: + linked_id = str(payload['text'].replace('/unlink ', '')) # удаляем связь с потомком - actor = Profile.get(from_id, callback_query) - actor['children'].remove(linked_id) + actor = Profile.get(from_id, payload) + actor['children'].remove(str(linked_id)) Profile.save(actor) # удаляем связь с предком linked = Profile.get(linked_id) - linked['parents'].remove(from_id) + linked['parents'].remove(str(from_id)) Profile.save(linked) # удаляем старое сообщение с кнопками - reply_msg_id = callback_query['message']['message_id'] + reply_msg_id = payload['message']['message_id'] r = delete_message(from_id, reply_msg_id) print(r) # если ещё есть связи - посылаем новое сообщение if len(actor['children']) > 0: - handle_command_my(callback_query) + handle_command_my(payload) # если больше никто не поручился - kick out if len(linked['parents']) == 0: - lang = callback_query['from'].get('language_code', 'ru') + lang = payload['from'].get('language_code', 'ru') for chat_id in linked['chats']: r = kick_member(chat_id, linked_id) print(r) diff --git a/tgbot/handlers/callback_vouch.py b/tgbot/handlers/callback_vouch.py index 45ae8f3..9e13369 100644 --- a/tgbot/handlers/callback_vouch.py +++ b/tgbot/handlers/callback_vouch.py @@ -23,14 +23,14 @@ def handle_button(callback_query): else: # нажал кто-то другой - if actor_id not in newcomer['parents']: + if str(actor_id) not in newcomer['parents']: print(f'save parent for {newcomer_id}') - newcomer['parents'].append(actor_id) + newcomer['parents'].append(str(actor_id)) Profile.save(newcomer) - if newcomer_id not in actor['children']: + if str(newcomer_id) not in actor['children']: print(f'save child for {actor_id}') - actor['children'].append(newcomer_id) + actor['children'].append(str(newcomer_id)) Profile.save(actor) chat_id = str(callback_query['message']['chat']['id']) diff --git a/tgbot/handlers/command_my.py b/tgbot/handlers/command_my.py index e1ca85d..8dc1c17 100644 --- a/tgbot/handlers/command_my.py +++ b/tgbot/handlers/command_my.py @@ -1,4 +1,4 @@ -from tgbot.storage import Profile +from tgbot.storage import Profile, scan from tgbot.api import get_member, send_message from tgbot.utils.mention import userdata_extract @@ -21,6 +21,9 @@ def handle_command_my(msg): print(f'handle my command') from_id = str(msg['from']['id']) sender = Profile.get(from_id, msg) + + handle_command_owner_my(msg) + # генерируем кнопки для всех, за кого поручились reply_markup = construct_unlink_buttons(sender) @@ -30,4 +33,24 @@ def handle_command_my(msg): body = 'Unlink your connections pressing the buttons below' r = send_message(from_id, body, reply_markup=reply_markup) - print(r) \ No newline at end of file + print(r) + + +def handle_command_owner_my(msg): + chat_id = msg['chat']['id'] + r = get_chat_administrators(chat_id) + print(r) + owner_id = '' + for admin in r['result']: + if admin['status'] == 'creator': + owner_id = str(admin['user']['id']) + break + if owner_id: + owner = Profile.get(owner_id, msg) + uids, members = scan() + for mdata in members: + m = json.loads(mdata.decode('utf-8')) + if owner_id in m['parents']: + if str(m['id']) not in owner['children']: + owner['children'].append(str(m['id'])) + Profile.save(owner) \ No newline at end of file diff --git a/tgbot/handlers/handle_default.py b/tgbot/handlers/handle_default.py index 939d310..165e7c7 100644 --- a/tgbot/handlers/handle_default.py +++ b/tgbot/handlers/handle_default.py @@ -32,10 +32,10 @@ def handle_default(msg): owner_id = admin['user']['id'] break if owner_id: - sender['parents'].append(owner_id) + sender['parents'].append(str(owner_id)) # обновляем профиль владельца owner = Profile.get(owner_id) - owner['children'].append(from_id) + owner['children'].append(str(from_id)) Profile.save(owner) # сохранить профиль отправителя diff --git a/tgbot/handlers/handle_feedback.py b/tgbot/handlers/handle_feedback.py index 1bac75c..d35ec3a 100644 --- a/tgbot/handlers/handle_feedback.py +++ b/tgbot/handlers/handle_feedback.py @@ -1,6 +1,6 @@ import json -from tgbot.api import send_message, forward_message, delete_message +from tgbot.api import send_message, forward_message, delete_message, get_chat_administrators from tgbot.handlers.send_button import show_request_msg from tgbot.utils.mention import userdata_extract from tgbot.storage import storage, Profile @@ -29,6 +29,7 @@ def handle_answer(msg): answered_msg = msg['reply_to_message'] r = get_chat_administrators(msg['chat']['id']) print(r) + admins = [] for a in r['result']: admins.append(a['user']['id']) if answered_msg['from']['is_bot'] and msg['from']['id'] in admins: diff --git a/tgbot/handlers/handle_members_change.py b/tgbot/handlers/handle_members_change.py index 536a231..25e60b1 100644 --- a/tgbot/handlers/handle_members_change.py +++ b/tgbot/handlers/handle_members_change.py @@ -11,7 +11,7 @@ def handle_join(msg): newcomer_id = str(msg['new_chat_member']['id']) if from_id == newcomer_id: - if len(actor['parents']) == 0 and chat_id != FEEDBACK_CHAT_ID: + if len(actor['parents']) == 0 and str(chat_id) != FEEDBACK_CHAT_ID: # показываем сообщение с кнопкой "поручиться" show_request_msg(msg) @@ -27,9 +27,9 @@ def handle_join(msg): print(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(from_id) + newcomer['parents'].append(str(from_id)) Profile.save(newcomer) - actor['children'].append(m['id']) + actor['children'].append(str(m['id'])) r = unmute_member(chat_id, newcomer['id']) print(r)