Исправить логику функции или заменить её
У меня есть код:
def get_messages(token:str, channel_id:int, last_message_id:int) -> list:
"""Returns a list of dicts containing new messages data"""
headers = {
'authorization': token,
}
dict_with_needed_message = {}
messages_amount = 50
while len(dict_with_needed_message) == 0:
r = requests.get(f"https://website/api/channels/{channel_id}/msgs?limit={messages_amount}", headers=headers)
list_of_dicts = json.loads(r.text)
dict_with_needed_message = list(filter(lambda find_dict: find_dict['id'] == str(last_message_id), list_of_dicts))[0]
if dict_with_needed_message:
dict_index = list_of_dicts.index(dict_with_needed_message)
if dict_index != 0:
new_messages_list = list_of_dicts[dict_index-1::-1]
else:
new_messages_list = []
else:
messages_amount += 50
return new_messages_list
Он уже выглядит непитонично, еще и условие нахождения dict_with_needed_message работает неправильно (в полученном словаре может быть вложенный ключ 'id', нужно проверять только значение первого ключа всего словаря).
Что должа делать функция:
- Входные данные остаются теми же
- Делать запрос с количеством сообщений по-умолчанию = 50
- В полученных данных находить номер словаря, значение первого ключа в котором = str(last_message_id)
- Если такого в списке нет, то кол-во сообщений увеличивается на 50 и делается повторый запрос. Так до тех пор, пока номер нужного сообщения не будет найден
- По полученному номеру сделать срез списка, получив список сообщений идущих после найденного и отразить его в обратном порядке
- Вернуть этот полученный список
Помогите подправить мой код или предложите вариант получше. Спасибо.
list_of_data:
[
{
'id': '961627935247331329',
'type': 19,
'content': 'Hello world!',
'channel_id': '737700125492772863',
'author': {
'id': '123456789123456789',
'username': 'TestUser',
'avatar': 'd0bd70431e24610fd067109f28654a5b',
'discriminator': '2806',
'public_flags': 64
},
'attachments': [
],
'embeds': [
],
'mentions': [
],
'mention_roles': [
],
'pinned': False,
'mention_everyone': False,
'tts': False,
'timestamp': '2022-04-07T14:06:05.946000+00:00',
'edited_timestamp': None,
'flags': 0,
'components': [
],
'message_reference': {
'channel_id': '737700125492772863',
'guild_id': '724241782833152050',
'message_id': '961550841163157544'
},
'referenced_message': {
'id': '961550841163157544',
'type': 0,
'content': 'test message by testuser',
'channel_id': '737700125492772863',
'author': {
'id': '123456789123456789',
'username': 'TestUser',
'avatar': 'd0bd70431e24610fd067109f28654a5b',
'discriminator': '2806',
'public_flags': 64
},
'attachments': [
],
'embeds': [
],
'mentions': [
],
'mention_roles': [
],
'pinned': False,
'mention_everyone': False,
'tts': False,
'timestamp': '2022-04-07T08:59:45.284000+00:00',
'edited_timestamp': None,
'flags': 0,
'components': [
]
}
},
{
'id': '961550841163157544',
'type': 0,
'content': 'new message from testuser 123',
'channel_id': '737700125492772863',
'author': {
'id': '123456789123456789',
'username': 'TestUser',
'avatar': 'd0bd70431e24610fd067109f28654a5b',
'discriminator': '2806',
'public_flags': 64
},
'attachments': [
],
'embeds': [
],
'mentions': [
],
'mention_roles': [
],
'pinned': False,
'mention_everyone': False,
'tts': False,
'timestamp': '2022-04-07T08:59:45.284000+00:00',
'edited_timestamp': None,
'flags': 0,
'components': [
]
},
{
'id': '961315800499761232',
'type': 0,
'content': 'abcdefgh',
'channel_id': '737700125492772863',
'author': {
'id': '123456789123456789',
'username': 'TestUser',
'avatar': 'd0bd70431e24610fd067109f28654a5b',
'discriminator': '2806',
'public_flags': 64
},
'attachments': [
],
'embeds': [
],
'mentions': [
],
'mention_roles': [
],
'pinned': False,
'mention_everyone': False,
'tts': False,
'timestamp': '2022-04-06T17:25:47.223000+00:00',
'edited_timestamp': None,
'flags': 0,
'components': [
]
},
{
'id': '961299163352559718',
'type': 0,
'content': 'foo bar qwerty 123',
'channel_id': '737700125492772863',
'author': {
'id': '123456789123456789',
'username': 'TestUser',
'avatar': 'd0bd70431e24610fd067109f28654a5b',
'discriminator': '2806',
'public_flags': 64
},
'attachments': [
],
'embeds': [
],
'mentions': [
],
'mention_roles': [
],
'pinned': False,
'mention_everyone': False,
'tts': False,
'timestamp': '2022-04-06T16:19:40.618000+00:00',
'edited_timestamp': None,
'flags': 0,
'components': [
]
}
]
Ответы (1 шт):
Автор решения: Сергей Шашко
→ Ссылка
Если я вас правельно понял. Возможен дождь, в виде ошибок
def get_messages(token: str, channel_id: int, last_message_id: int) -> list:
headers = {
'authorization': token,
}
dict_with_needed_message = {}
messages_amount = 50
while True:
new_messages_list = []
r = requests.get(f"https://website/api/channels/{channel_id}/msgs?limit={messages_amount}", headers=headers)
list_of_dicts = r.json()
for index, list_dict in enumerate(list_of_dicts):
if list_dict['id'] == str(last_message_id):
new_messages_list = list_of_dicts[index:][::-1]
return new_messages_list
else:
messages_amount += 50