From f16b939d591bec05d3f1b42d6ccb4aac74831a92 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 11 Sep 2023 20:02:29 +0300 Subject: [PATCH] 0.0.12-fixes --- .idea/.gitignore | 8 +++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/misc.xml | 4 ++ .idea/modules.xml | 8 +++ .idea/vcs.xml | 6 ++ .idea/welcome-webhook-bot.iml | 17 +++++ CHANGELOG.md | 3 +- api/webhook.py | 62 ++++++++++--------- bot/handlers/command_ask.py | 4 +- bot/handlers/command_my.py | 28 ++++++--- bot/handlers/handle_default.py | 5 +- bot/handlers/handle_feedback.py | 27 +++++--- bot/handlers/send_button.py | 1 + bot/state.py | 10 +++ 14 files changed, 136 insertions(+), 53 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/welcome-webhook-bot.iml create mode 100644 bot/state.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..2f146d8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..6887202 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/welcome-webhook-bot.iml b/.idea/welcome-webhook-bot.iml new file mode 100644 index 0000000..5195124 --- /dev/null +++ b/.idea/welcome-webhook-bot.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 667b05c..5d657a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ ## [0.0.12] - исправления в коммандах /ask и /my - исправление обработки случая без фото -- +- добавлен автомат состояний +- добавлена возможность высказаться "на кругу" без одобрения заявки ## [0.0.11] diff --git a/api/webhook.py b/api/webhook.py index 32cb76d..73d48fa 100644 --- a/api/webhook.py +++ b/api/webhook.py @@ -12,10 +12,13 @@ from bot.handlers.callback_unlink import handle_unlink from bot.handlers.handle_startup import handle_startup from bot.api import register_webhook, send_message from bot.config import FEEDBACK_CHAT_ID +from bot.state import State app = Sanic(name="welcomecenter") app.config.REGISTERED = False +state = State() + @app.get('/') async def register(req): @@ -36,33 +39,38 @@ async def handle(req): # видимые сообщения msg = update.get('message', update.get('edited_message')) if msg: - if 'edited_message' in update: - msg['edit'] = True - if 'text' in msg: - if msg['chat']['id'] == msg['from']['id']: - 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: - print('feedback chat message') - if 'reply_to_message' in msg: - handle_answer(msg) - elif msg['text'] == '/graph': - await handle_command_graph(msg) - elif msg['text'].startswith('/ask'): - handle_command_ask(msg) + msg['edit'] = 'edited_message' in update + + if msg['chat']['id'] == msg['from']['id']: + # сообщения в личке с ботом + print('private chat message') + if msg['text'].startswith('/my'): + handle_command_my(msg) + elif msg['text'].startswith('/unlink'): + handle_unlink(msg) else: - handle_default(msg) - elif 'new_chat_member' in msg: - handle_join(msg) - elif 'left_chat_member' in msg: - handle_left(msg) + handle_feedback(msg, state) + + elif str(msg['chat']['id']) == FEEDBACK_CHAT_ID: + # сообщения из группы обратной связи + print('feedback chat message') + if 'reply_to_message' in msg: + handle_answer(msg) + elif msg['text'] == '/graph': + await handle_command_graph(msg) + elif msg['text'].startswith('/ask'): + handle_command_ask(msg) + else: - print('message without text') + # сообщения из всех остальных групп + cid = msg['chat']['id'] + print(f'group {cid} chat message') + if 'text' in msg: + handle_default(msg) + elif 'new_chat_member' in msg: + handle_join(msg) + elif 'left_chat_member' in msg: + handle_left(msg) # кнопки elif 'callback_query' in update: @@ -76,10 +84,6 @@ async def handle(req): elif 'chat_join_request' in update: print('chat join request') handle_join_request(update['chat_join_request']) - - # wtf - else: - print('unhandled update') except Exception: diff --git a/bot/handlers/command_ask.py b/bot/handlers/command_ask.py index 2f04113..4cc8718 100644 --- a/bot/handlers/command_ask.py +++ b/bot/handlers/command_ask.py @@ -3,8 +3,8 @@ from bot.handlers.send_button import show_request_msg from bot.api import get_member def handle_command_ask(msg): - print(f'handling request resend') - cmd, chat_id, member_id = msg['text'].split(' ') + print('handling request resend') + _cmd, chat_id, member_id = msg['text'].split(' ') chat_id = chat_id.replace('-', '-100') r = get_member(chat_id, member_id) print(r) diff --git a/bot/handlers/command_my.py b/bot/handlers/command_my.py index 5f80c2f..17aedef 100644 --- a/bot/handlers/command_my.py +++ b/bot/handlers/command_my.py @@ -14,23 +14,33 @@ def construct_unlink_buttons(actor): 'text': f'{identity} {username}', 'callback_data': 'unlink' + vouch }) - return { "inline_keyboard": [ buttons, ] } + return buttons -def handle_command_my(msg): - print(f'handle my command') +def handle_command_my(msg, state): + print('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) - - if msg['from'].get('language_code', 'ru') == 'ru': - body = 'Нажмите кнопки ниже, чтобы удалить ваши связи' + buttons = construct_unlink_buttons(sender) + reply_markup = { "inline_keyboard": [ buttons, ] } + if len(buttons) == 0: + if msg['from'].get('language_code', 'ru') == 'ru': + body = 'Вас ещё никто не узнал? Напишите, я передам нашему кругу' + else: + body = 'Nobody recognized you? Speak, I will pass your message to the circle' + r = send_message(from_id, body) + print(r) + chat_id = msg['chat']['id'] + state.make_talking(from_id, chat_id) else: - body = 'Unlink your connections pressing the buttons below' + if msg['from'].get('language_code', 'ru') == 'ru': + body = 'Нажмите кнопки ниже, чтобы удалить ваши связи' + else: + body = 'Unlink your connections pressing the buttons below' r = send_message(from_id, body, reply_markup=reply_markup) print(r) @@ -47,7 +57,7 @@ def handle_command_owner_my(msg): break if owner_id: owner = Profile.get(owner_id, msg) - uids, members = scan() + _uids, members = scan() for mdata in members: m = json.loads(mdata.decode('utf-8')) if owner_id in m['parents']: diff --git a/bot/handlers/handle_default.py b/bot/handlers/handle_default.py index 74ff7f2..5a40afd 100644 --- a/bot/handlers/handle_default.py +++ b/bot/handlers/handle_default.py @@ -3,20 +3,21 @@ from bot.storage import Profile, storage from bot.handlers.send_button import show_request_msg def handle_default(msg): - print(f'default handler for all messages') + print('default handler for all messages') chat_id = str(msg['chat']['id']) from_id = str(msg['from']['id']) sender = Profile.get(from_id, msg) if msg['text'].startswith('/my'): # команда в групповом чате - print(f'remove some messages in group chat') + print('remove some messages in group chat') # удалить сообщение с командой /my r = delete_message(chat_id, msg['message_id']) print(r) # показать новое сообщение с кнопкой + # для дополнительного поручения show_request_msg(msg) else: # любое другое сообщение diff --git a/bot/handlers/handle_feedback.py b/bot/handlers/handle_feedback.py index ab56c9c..59a77db 100644 --- a/bot/handlers/handle_feedback.py +++ b/bot/handlers/handle_feedback.py @@ -7,21 +7,28 @@ from bot.storage import storage, Profile from bot.config import FEEDBACK_CHAT_ID -def handle_feedback(msg): +def handle_feedback(msg, state): mid = msg['message_id'] cid = msg['chat']['id'] if msg['text'] == '/start': r = send_message(cid, 'Напишите своё сообщение для администрации чата') print(r) else: - r = forward_message(cid, mid, FEEDBACK_CHAT_ID) - support_msg_id = r['result']['message_id'] - # сохранение айди сообщения в приватной переписке с ботом - storage.set(f'fbk-{support_msg_id}', json.dumps({ - "author_id": msg["from"]["id"], - "message_id": mid, - "chat_id": cid - })) + uid = msg['from']['id'] + if state.is_talking(uid): + r = forward_message(cid, mid, state.talking[uid]) + print(r) + state.aho(uid) + else: + r = forward_message(cid, mid, FEEDBACK_CHAT_ID) + print(r) + support_msg_id = r['result']['message_id'] + # сохранение айди сообщения в приватной переписке с ботом + storage.set(f'fbk-{support_msg_id}', json.dumps({ + "author_id": msg["from"]["id"], + "message_id": mid, + "chat_id": cid + })) @@ -37,7 +44,7 @@ def handle_answer(msg): # получение сохраненного информации о сообщении для ответа stored_feedback = storage.get(f'fbk-{support_msg_id}') if stored_feedback: - print(f'handle answer from support') + print('handle an answer from feedback group') stored_feedback = json.loads(stored_feedback) r = send_message(f'{stored_feedback["chat_id"]}', msg['text'], reply_to=stored_feedback["message_id"]) print(r) diff --git a/bot/handlers/send_button.py b/bot/handlers/send_button.py index 936049b..7fb6dc8 100644 --- a/bot/handlers/send_button.py +++ b/bot/handlers/send_button.py @@ -3,6 +3,7 @@ from bot.utils.mention import mention, userdata_extract from bot.storage import storage def show_request_msg(msg): + print("showing request with button") chat_id = str(msg['chat']['id']) from_id = str(msg['from']['id']) lang = msg['from'].get('language_code', 'ru') diff --git a/bot/state.py b/bot/state.py new file mode 100644 index 0000000..f1cab5f --- /dev/null +++ b/bot/state.py @@ -0,0 +1,10 @@ + +class State: + def __init__(self): + self.talking = dict() + def is_talking(self, uid): + return uid in self.talking + def make_talking(self, uid, cid): + self.talking[uid] = cid + def aho(self, uid): + del self.talking[uid]