Этот вопрос закрыт для ответов, так как повторяет вопрос Disnake как сделать страницы в команде help?
Antsently
@Antsently

Как правильно сделать пагинацию ембеда?

Не понимаю, как сделать пагинацию с реакциями(или кнопками) в 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"```css\nБоев: {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"```css\n" \
                                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 танков вот так:
Изображение
65fee404ec989978409665.png


Я бы хотел выводить по 10 танков(Изображение 2) и добавлять реакции на ембед для переключения по страничкам, но все что у меня получалось это ошибка: 'NoneType' object has no attribute 'add_reaction'. Думал использовать пагинацию, чтобы получать все данные, а не ограничивать их из-за ограничений по символам дискорда или же ембеда.

Вот примерный вид:
Изображение 2
65fee4c9e5d29528415133.png
  • Вопрос задан
  • 56 просмотров
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы