Исправить логику функции или заменить её

У меня есть код:

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
→ Ссылка