0.0.11 refactor, fixes unlink
This commit is contained in:
@@ -7,6 +7,8 @@
|
|||||||
- исправлен kick/approve на старте
|
- исправлен kick/approve на старте
|
||||||
- сообщение во все чаты, если отменили все одобрения
|
- сообщение во все чаты, если отменили все одобрения
|
||||||
- ответы учитываются только от админов FEEDBACK-чата
|
- ответы учитываются только от админов FEEDBACK-чата
|
||||||
|
- логика целостности данных для связей
|
||||||
|
- команда /unlink по внутреннему айди
|
||||||
|
|
||||||
|
|
||||||
## [0.0.10]
|
## [0.0.10]
|
||||||
|
@@ -48,6 +48,8 @@ async def handle(req):
|
|||||||
print('private chat message')
|
print('private chat message')
|
||||||
if msg['text'].startswith('/my'):
|
if msg['text'].startswith('/my'):
|
||||||
handle_command_my(msg)
|
handle_command_my(msg)
|
||||||
|
elif msg['text'].startswith('/unlink'):
|
||||||
|
handle_unlink(msg)
|
||||||
else:
|
else:
|
||||||
handle_feedback(msg)
|
handle_feedback(msg)
|
||||||
elif str(msg['chat']['id']) == FEEDBACK_CHAT_ID:
|
elif str(msg['chat']['id']) == FEEDBACK_CHAT_ID:
|
||||||
|
@@ -5,34 +5,38 @@ from tgbot.storage import Profile
|
|||||||
|
|
||||||
# remove link of callback sender
|
# remove link of callback sender
|
||||||
# from member vouched before
|
# from member vouched before
|
||||||
def handle_unlink(callback_query):
|
def handle_unlink(payload):
|
||||||
print('handle unlink button pressed, private chat only')
|
print('handle unlink button pressed or command, private chat only')
|
||||||
|
|
||||||
from_id = str(callback_query['from']['id'])
|
from_id = str(payload['from']['id'])
|
||||||
linked_id = str(callback_query['data'].replace('unlink', ''))
|
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 = Profile.get(from_id, payload)
|
||||||
actor['children'].remove(linked_id)
|
actor['children'].remove(str(linked_id))
|
||||||
Profile.save(actor)
|
Profile.save(actor)
|
||||||
|
|
||||||
# удаляем связь с предком
|
# удаляем связь с предком
|
||||||
linked = Profile.get(linked_id)
|
linked = Profile.get(linked_id)
|
||||||
linked['parents'].remove(from_id)
|
linked['parents'].remove(str(from_id))
|
||||||
Profile.save(linked)
|
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)
|
r = delete_message(from_id, reply_msg_id)
|
||||||
print(r)
|
print(r)
|
||||||
|
|
||||||
# если ещё есть связи - посылаем новое сообщение
|
# если ещё есть связи - посылаем новое сообщение
|
||||||
if len(actor['children']) > 0:
|
if len(actor['children']) > 0:
|
||||||
handle_command_my(callback_query)
|
handle_command_my(payload)
|
||||||
|
|
||||||
# если больше никто не поручился - kick out
|
# если больше никто не поручился - kick out
|
||||||
if len(linked['parents']) == 0:
|
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']:
|
for chat_id in linked['chats']:
|
||||||
r = kick_member(chat_id, linked_id)
|
r = kick_member(chat_id, linked_id)
|
||||||
print(r)
|
print(r)
|
||||||
|
@@ -23,14 +23,14 @@ def handle_button(callback_query):
|
|||||||
else:
|
else:
|
||||||
# нажал кто-то другой
|
# нажал кто-то другой
|
||||||
|
|
||||||
if actor_id not in newcomer['parents']:
|
if str(actor_id) not in newcomer['parents']:
|
||||||
print(f'save parent for {newcomer_id}')
|
print(f'save parent for {newcomer_id}')
|
||||||
newcomer['parents'].append(actor_id)
|
newcomer['parents'].append(str(actor_id))
|
||||||
Profile.save(newcomer)
|
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}')
|
print(f'save child for {actor_id}')
|
||||||
actor['children'].append(newcomer_id)
|
actor['children'].append(str(newcomer_id))
|
||||||
Profile.save(actor)
|
Profile.save(actor)
|
||||||
|
|
||||||
chat_id = str(callback_query['message']['chat']['id'])
|
chat_id = str(callback_query['message']['chat']['id'])
|
||||||
|
@@ -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.api import get_member, send_message
|
||||||
from tgbot.utils.mention import userdata_extract
|
from tgbot.utils.mention import userdata_extract
|
||||||
|
|
||||||
@@ -21,6 +21,9 @@ def handle_command_my(msg):
|
|||||||
print(f'handle my command')
|
print(f'handle my command')
|
||||||
from_id = str(msg['from']['id'])
|
from_id = str(msg['from']['id'])
|
||||||
sender = Profile.get(from_id, msg)
|
sender = Profile.get(from_id, msg)
|
||||||
|
|
||||||
|
handle_command_owner_my(msg)
|
||||||
|
|
||||||
# генерируем кнопки для всех, за кого поручились
|
# генерируем кнопки для всех, за кого поручились
|
||||||
reply_markup = construct_unlink_buttons(sender)
|
reply_markup = construct_unlink_buttons(sender)
|
||||||
|
|
||||||
@@ -30,4 +33,24 @@ def handle_command_my(msg):
|
|||||||
body = 'Unlink your connections pressing the buttons below'
|
body = 'Unlink your connections pressing the buttons below'
|
||||||
|
|
||||||
r = send_message(from_id, body, reply_markup=reply_markup)
|
r = send_message(from_id, body, reply_markup=reply_markup)
|
||||||
print(r)
|
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)
|
@@ -32,10 +32,10 @@ def handle_default(msg):
|
|||||||
owner_id = admin['user']['id']
|
owner_id = admin['user']['id']
|
||||||
break
|
break
|
||||||
if owner_id:
|
if owner_id:
|
||||||
sender['parents'].append(owner_id)
|
sender['parents'].append(str(owner_id))
|
||||||
# обновляем профиль владельца
|
# обновляем профиль владельца
|
||||||
owner = Profile.get(owner_id)
|
owner = Profile.get(owner_id)
|
||||||
owner['children'].append(from_id)
|
owner['children'].append(str(from_id))
|
||||||
Profile.save(owner)
|
Profile.save(owner)
|
||||||
|
|
||||||
# сохранить профиль отправителя
|
# сохранить профиль отправителя
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import json
|
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.handlers.send_button import show_request_msg
|
||||||
from tgbot.utils.mention import userdata_extract
|
from tgbot.utils.mention import userdata_extract
|
||||||
from tgbot.storage import storage, Profile
|
from tgbot.storage import storage, Profile
|
||||||
@@ -29,6 +29,7 @@ def handle_answer(msg):
|
|||||||
answered_msg = msg['reply_to_message']
|
answered_msg = msg['reply_to_message']
|
||||||
r = get_chat_administrators(msg['chat']['id'])
|
r = get_chat_administrators(msg['chat']['id'])
|
||||||
print(r)
|
print(r)
|
||||||
|
admins = []
|
||||||
for a in r['result']:
|
for a in r['result']:
|
||||||
admins.append(a['user']['id'])
|
admins.append(a['user']['id'])
|
||||||
if answered_msg['from']['is_bot'] and msg['from']['id'] in admins:
|
if answered_msg['from']['is_bot'] and msg['from']['id'] in admins:
|
||||||
|
@@ -11,7 +11,7 @@ def handle_join(msg):
|
|||||||
|
|
||||||
newcomer_id = str(msg['new_chat_member']['id'])
|
newcomer_id = str(msg['new_chat_member']['id'])
|
||||||
if from_id == newcomer_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)
|
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}')
|
print(f'{len(msg["new_chat_members"])} members were invited by {from_id}')
|
||||||
for m in msg['new_chat_members']:
|
for m in msg['new_chat_members']:
|
||||||
newcomer = Profile.get(m['id'])
|
newcomer = Profile.get(m['id'])
|
||||||
newcomer['parents'].append(from_id)
|
newcomer['parents'].append(str(from_id))
|
||||||
Profile.save(newcomer)
|
Profile.save(newcomer)
|
||||||
actor['children'].append(m['id'])
|
actor['children'].append(str(m['id']))
|
||||||
r = unmute_member(chat_id, newcomer['id'])
|
r = unmute_member(chat_id, newcomer['id'])
|
||||||
print(r)
|
print(r)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user