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

Ссылка скопирована
1 ответ

Не понимаю, как сделать пагинацию с реакциями(или кнопками) в 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

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

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Андрей PHP Ответ

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

Прежде всего, вам необходимо определить, какой контент будет отображаться на каждой странице. Затем вам нужно будет создать функцию или метод, который будет определять, какую часть контента показывать на текущей странице.

Далее необходимо добавить элементы управления для навигации между страницами. Например, кнопки "Предыдущая" и "Следующая", либо цифровые кнопки для быстрого перехода на конкретную страницу.

Пример использования пагинации в PHP:

// Определение количества элементов на странице
$items_per_page = 10;
 
// Получение текущей страницы
$current_page = isset($_GET['page']) ? $_GET['page'] : 1;
 
// Определение начального элемента на странице
$start = ($current_page - 1) * $items_per_page;
 
// Получение данных из базы данных с учетом пагинации
$query = "SELECT * FROM table LIMIT $start, $items_per_page";
$result = mysqli_query($connection, $query);
 
// Отображение данных на странице
while ($row = mysqli_fetch_assoc($result)) {
    // Вывод данных
}
 
// Создание элементов управления для навигации
$total_pages = ceil($total_items / $items_per_page);
for ($i = 1; $i <= $total_pages; $i++) {
    echo &quot;<a href='?page=$i'>$i</a> ";
}

Таким образом, используя подобный подход, вы сможете реализовать пагинацию для ембеда на вашем сайте. Не забывайте также обработать случаи, когда пользователь заходит на несуществующую страницу или вводит некорректные данные.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно