Как правильно сделать пагинацию ембеда?
Не понимаю, как сделать пагинацию с реакциями(или кнопками) в disnake.
Вот код метода:
async def send_session_embed(self, ctx, session): try: start_time = session["start_time"].strftime('%d.%m.%Y %H:%M:%S') account_id = session["account_id"] nickname = session["nickname"] main_embed = disnake.Embed( title=f"От: {start_time}nСессия для: `{nickname} | {account_id}`", ) if "tanks_stats" in session: stats = session["tanks_stats"] player_data = self.api.get_player_technique_stats( session["account_id"]) total_battles = 0 total_wins = 0 total_damage = 0 tank_info_list = [] for tank_id, saved_stats in stats.items(): tank_data = next((tank_info["all"] for tank_info in player_data if str( tank_info["tank_id"]) == tank_id), None) if tank_data: current_battles = tank_data.get('battles', 0) current_wins = tank_data.get('wins', 0) current_damage_dealt = tank_data.get('damage_dealt', 0) last_battle_time = datetime.fromtimestamp( tank_data.get('last_battle_time', 0), tz=timezone.utc) saved_battles = saved_stats["battles"] saved_wins = saved_stats["wins"] saved_damage_dealt = saved_stats["damage_dealt"] saved_last_battle_time = datetime.fromtimestamp( saved_stats.get("last_battle_time", 0), tz=timezone.utc) if (current_battles > saved_battles or current_wins > saved_wins or current_damage_dealt > saved_damage_dealt or last_battle_time > saved_last_battle_time): delta_battles = current_battles - saved_battles delta_wins = current_wins - saved_wins delta_damage = current_damage_dealt - saved_damage_dealt delta_last_battle_time = last_battle_time > saved_last_battle_time win_rate = (delta_wins / delta_battles) * 100 if delta_battles != 0 else 0 avg_damage = round( delta_damage / delta_battles) if delta_battles > 0 else 0 total_battles += delta_battles total_wins += delta_wins total_damage += delta_damage try: tank_info = await self.get_tank_info_embed(int(tank_id)) tank_name = tank_info['name'] if tank_info else "Неизвестный танк" except KeyError: tank_name = "Неизвестный танк" tank_info_list.append({ "name": tank_name, "win_rate": win_rate, "avg_damage": avg_damage, "battles": delta_battles, "last_battle_time": delta_last_battle_time }) win_rate = (total_wins / total_battles) * 100 if total_battles != 0 else 0 avg_damage = total_damage // total_battles if total_battles > 0 else 0 main_embed.add_field( name="", value=f"```cssnБоев: {total_battles}nПП: {win_rate:.2f}%nСр. урон: {avg_damage}```", inline=False ) if tank_info_list: sorted_tank_info_list = sorted( tank_info_list, key=lambda x: x["last_battle_time"], reverse=True) tank_info_chunks = [ sorted_tank_info_list[i:i + 5] for i in range(0, len(sorted_tank_info_list), 25)] for chunk in tank_info_chunks: tank_info_str = "" for tank_info in chunk: tank_name = tank_info["name"] win_rate = tank_info["win_rate"] avg_damage = tank_info["avg_damage"] battles = tank_info["battles"] tank_info_str += f"**{tank_name}**" f"```cssn" f"ПП: {win_rate:.2f}% Урон: {avg_damage} Бои: {battles}" f"```n" main_embed.add_field( name="", value=tank_info_str, inline=False ) await ctx.edit_original_message(embed=main_embed) else: await ctx.send(embed=disnake.Embed(description="Сыграйте хотя бы один бой, чтобы посмотреть сессию!")) except Exception as e: await ctx.send(f"Произошла ошибка при отправке сессии: {e}") |
Код выводит временно 5 танков вот так:
Изображение
Я бы хотел выводить по 10 танков(Изображение 2) и добавлять реакции на ембед для переключения по страничкам, но все что у меня получалось это ошибка: 'NoneType' object has no attribute 'add_reaction'. Думал использовать пагинацию, чтобы получать все данные, а не ограничивать их из-за ограничений по символам дискорда или же ембеда.
Вот примерный вид:
Изображение 2
Дополнительно:
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


Для того чтобы правильно сделать пагинацию ембеда, вам потребуется использовать какой-то метод для разделения контента на отдельные страницы и добавления элементов управления для навигации между этими страницами. В случае с ембедом, это может быть, например, динамическая подгрузка контента при прокрутке или кнопки "Предыдущая" и "Следующая".
Прежде всего, вам необходимо определить, какой контент будет отображаться на каждой странице. Затем вам нужно будет создать функцию или метод, который будет определять, какую часть контента показывать на текущей странице.
Далее необходимо добавить элементы управления для навигации между страницами. Например, кнопки "Предыдущая" и "Следующая", либо цифровые кнопки для быстрого перехода на конкретную страницу.
Пример использования пагинации в PHP:
Таким образом, используя подобный подход, вы сможете реализовать пагинацию для ембеда на вашем сайте. Не забывайте также обработать случаи, когда пользователь заходит на несуществующую страницу или вводит некорректные данные.