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]