welcomecenterbot/tgbot/handlers.py

167 lines
6.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from tgbot.api import send_message, forward_message, delete_message, \
ban_member, unban_member, set_chatpermissions
from tgbot.config import FEEDBACK_CHAT_ID, WELCOME_MSG, BUTTON_NO, \
BUTTON_OK, CHAT_ID, REDIS_URL
import json
import redis
from tgbot.profile import Profile as ProfileObj
# сохраняет сессии и пересылаемые сообщения между перезагрузками
storage = redis.from_url(REDIS_URL)
# хранение необходимой информации о пользователях
Profile = ProfileObj(storage)
def handle_feedback(msg):
mid = msg['message_id']
cid = msg['chat']['id']
r = forward_message(cid, mid, FEEDBACK_CHAT_ID).json()
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
}))
def handle_answer(msg):
print(f'handle answer from support')
support_msg_id = str(msg['reply_to_message']['message_id'])
# получение сохраненного айди сообщения из личной переписки с ботом
stored_feedback = storage.get(f'fbk-{support_msg_id}')
stored_feedback = json.loads(stored_feedback)
r = send_message(f'{stored_feedback["chat_id"]}', msg['text'], reply_to=stored_feedback["message_id"]) # notice 'u' before private chat ID
print(r.json())
def handle_join(msg):
chat_id = str(msg['chat']['id'])
from_id = str(msg['from']['id'])
member_id = str(msg['new_chat_member']['id'])
if from_id == member_id:
newcomer = Profile.get(member_id)
print(f'new self-joined member {member_id}')
reply_markup = {
"inline_keyboard": [
[
{"text": BUTTON_NO, "callback_data": BUTTON_NO},
{"text": BUTTON_OK, "callback_data": BUTTON_OK},
{"text": BUTTON_VOUCH, "callback_data": BUTTON_VOUCH}
]
]
}
r = send_message(
chat_id,
WELCOME_MSG,
reply_to=msg['message_id'],
reply_markup=reply_markup
)
welcome_msg_id = r.json()['result']['message_id']
print(r.json())
print(f'welcome message id: {welcome_msg_id}')
newcomer["newcomer"] = True
newcomer["welcome_id"] = welcome_msg_id
perms = {
"can_send_messages": False
}
r = set_chatpermissions(CHAT_ID, perms)
print(r.json())
# обновляем профиль новичка
Profile.save(newcomer)
elif 'new_chat_members' in msg:
# кто-то пригласил новых участников
print(f'{len(msg["new_chat_members"])} members were invited by {from_id}')
# получаем его профиль
inviter = Profile.get(from_id)
for m in msg['new_chat_members']:
newcomer = Profile.get(m['id'])
newcomer['vouched_by'].append(from_id)
Profile.save(newcomer)
inviter['vouched_for'].append(m['id'])
# обновляем профиль пригласившего
Profile.save(inviter)
def handle_left(msg):
print(f'handling member leaving')
member_id = msg["left_chat_member"]["id"]
# профиль покидающего чат
leaver = Profile.get(member_id)
r = delete_message(CHAT_ID, leaver['welcome_id'])
print(r.json())
Profile.leaving(leaver)
def handle_button(callback_query):
if 'reply_to_message' not in callback_query['message']:
# удаляет сообщение с кнопкой, если оно уже ни на что не отвечает
r = delete_message(CHAT_ID, callback_query['message'])
print(r.json())
else:
member_id = str(callback_query['from']['id'])
callback_data = callback_query['data']
welcomed_member_id = str(callback_query['message']['reply_to_message']['from']['id'])
welcome_msg_id = str(callback_query['message']['message_id'])
enter_msg_id = str(callback_query['message']['reply_to_message']['message_id'])
# получаем профиль нажавшего кнопку
actor = Profile.get(member_id)
if welcomed_member_id == member_id:
print(f'callback_query in {CHAT_ID}')
if callback_data == BUTTON_NO:
print('wrong answer, cleanup')
r = delete_message(CHAT_ID, enter_msg_id)
print(r.json())
r = delete_message(CHAT_ID, welcome_msg_id)
print(r.json())
print('ban member')
r = ban_member(CHAT_ID, member_id)
print(r.json())
# обработка профиля заблокированного пользователя
Profile.leaving(actor)
elif callback_data == BUTTON_OK:
print('proper answer, cleanup')
r = delete_message(CHAT_ID, welcome_msg_id)
print(r.json())
actor['newcomer'] = False
r = delete_message(CHAT_ID, author["welcome_id"])
print(r.json())
r = set_chatpermissions(CHAT_ID, { "can_send_messages": True })
print(r.json())
# обновление профиля нажавшего правильную кнопку
Profile.save(actor)
elif callback_data == BUTTON_VOUCH:
# это кнопка поручения
print(f'vouch button pressed by {member_id}')
newcomer = Profile.get(welcomed_member_id)
if welcomed_member_id not in inviter['vouched_for'] and \
member_id not in newcomer['vouched_by']:
newcomer['vouched_by'].append(welcomed_member_id)
actor['vouched_for'].append(member_id)
Profile.save(newcomer)
Profile.save(actor)
print('vouch success, unban member')
r = unban_member(CHAT_ID, member_id)
print(r.json())