• Литература для последовательного изучения программирования?

    fenrir1121
    @fenrir1121
    Начни с документации
    Искусство Программирования - Д. Кнут
    Ответ написан
    7 комментариев
  • Как отключить кнопки после нажатия?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Обычно применяют два подхода. Либо удаляют кнопки, либо делают их не активными.
    for child in view.children:
        if isinstance(child, disnake.ui.Button):
            child.disabled = True
    await message.edit(view=view)
    Ответ написан
  • Не отображается слеш команда в списке команд. Сама команда реализована когом. Что нужно изменить в коде?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Не надо так делать
    660e372e0c002537203138.jpeg

    Давайте распутывать этот узел:

    Все классы расположенные в disnake.ui предназначены для упрощения создания компонентов. Не надо их с чем-то мешать, кроме миксинов, которые тоже предназначены для создания компонентов, например пагинации.

    Ваше создание команды мало того, что почему-то лежит в колбеке, так еще в декораторе идет запрос объекта bot, а у вас во-первых внутри класса он лежит в self.bot, во-вторых регистрация команд в когах осуществляется через commands.slash_command.

    Вся эта каша запускается только потому, что кусок кода с "командой" в рантайме никогда не вызывается. Ну и разумеется по этой же причине команда не видна.

    Все ссылки выше ведут на официальную документацию, которая содержить понятные примеры использования. Перепишите все как два отдельных класса: первый содержит команды, второй отвечает за создание и взаимодействие с модальным окном.
    Ответ написан
    Комментировать
  • Какие существуют библиотеки Python для комплексной обработки текста, включая исправление ошибок и удаление лишних символов?

    fenrir1121
    @fenrir1121
    Начни с документации
    Я рассмотрел несколько вариантов, но они либо были слишком базовы для моих нужд, либо требовательны к ресурсам.
    А как по вашему библиотека должна понимать что правильно? Придётся разбираться в "слишком базовых" вещах.
    Грамматические ошибки (например, "Я не знает куда он пошёл." должно стать "Я не знаю, куда он пошёл.").
    А может быть "Она не знает куда он пошёл"?
    NLP задачи это всегда или долго или дорого. А иногда и то и другое.

    Серебрянной пули не будет. По библиотекам смотрите на набор Natasha, в первую очередь на razdel. Или как альтернативу DeepPavlov.
    Так же можно попробовать довериться в решении задачи современным LLM, но это отдельная кроличья нора со своими особенностями.
    Ответ написан
    1 комментарий
  • Бот дискорда падает в Rate limited, что делать?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Давайте по порядку. В документации дискорда очень четко прописаны лимиты для вебсокета и чуть менее четко для HTTP. Цитировать оттуда не буду, думаю там все понятно.

    В общем виде ошибка 429 говорит, что в один из двух лимитов вы не укладываетесь. Чтобы не происходила ошибка можно перед выполнением действий проверять блокировку через AutoShardedClient.is_ws_ratelimited, но это не лечение проблемы, а только обработка.
    Для лечения нужно перехватывать ошибку в глобальном обработчике и по стеку вызовов смотреть на каком действии она происходит. Если приложите стектрейс к запросу, можно будет по нему сказать конкретнее. Только убедитесь чтобы логи не обрезались как у вас выше. Может быть и так было бы понятно, но эндпоинт https://discord.com/api/v10/channels/1215300998588... весь не видно. Учитывайте что она может и в разных когах происходить об этом ниже.

    В целом дискорд не любит, когда боты делают что-либо без явных действий пользователя. Причем чем больше бот, тем строже, поскольку для них это больше нагрузки. К примеру в коде, который вы приложили есть обновление статуса каждые 10 секунд. Будем объективны, пользователям плевать что у бота в статусе, но эти запросы так же идут в общий рейт лимит. Я бы советовал поставить или большое значение (5-10 минут) или вообще избавиться от этой карусели.
    Аналогично пройдите по остальному коду, который не приложен и посмотрите есть ли периодические запросы без явных команд: например обновления каких-нибудь сообщений по таймерам. Если есть увеличивайте таймеры в 2 раза (повторять до исправления) или подумайте как предоставлять функционал без этого.
    Ответ написан
    2 комментария
  • Как исправить ошибку "is not a valid parameter annotation" слэш-команды в когах?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    В слеш командах типы не просто показывают что за объект, но и выполняют конвертацию.
    Документацией в слеш командах разрешены следующие типы
    str
    int
    float
    bool
    disnake.abc.GuildChannel*
    disnake.User or disnake.Member**
    disnake.Role**
    disnake.Attachment
    disnake.abc.Snowflake***

    Судя по тому, что вы пытаетесь принимать commands.Context, которого в слеш командах нет, вы с предыдущих вопросов так и не ознакомились с различиями между обычными командами и слешами.

    Как исправить ошибку
    Либо переписать функцию, потому что во взаимодействии нет методов и атрибутов, которые вы пытаетесь использовать, либо оставить команду обычной.
    Ответ написан
    Комментировать
  • Как вытащить значение их класса, и чтоб давался ответ?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Вы делаете цикл по текстовым полям и добавляете их как отдельные поля ответа
    for key, value in inter.text_values.items():
                embed.add_field(
                    name=key.capitalize(),
                    value=value[:1024],
                    inline=False,
                )


    Чтобы они были в одну строчку, нужно добавить их в одно поле.
    embed.add_field(
            name='Заголовок',
            value=f'{inter.text_values.get("date",  "")}{inter.text_values.get("time",  "")',
            inline=False,
    )
    Ответ написан
    1 комментарий
  • Как сделать такую капчу?

    fenrir1121
    @fenrir1121
    Начни с документации
    В telebot нет встроенного генератора каптч. Берете любую библиотеку из поиска, которая вам подходит.
    Например captcha или pyTelegramBotCAPTCHA
    Ответ написан
    Комментировать
  • Как исправить ошибку "AttributeError: 'set' object has no attribute 'items'" в дискорд-боте?

    fenrir1121
    @fenrir1121
    Начни с документации
    Почитайте этот пример, запустите его и посмотрите на результат
    s = {'123'}
    d = {'token': '123'}
    print(type(s))
    print(type(d))


    Вы явно хотите использовать словарь, но создали вместо этого множество о чем вам написано в ошибке.
    Ответ написан
    Комментировать
  • Скрипт отправки сообщений в канал Дискорда?

    fenrir1121
    @fenrir1121
    Начни с документации
    Юзерботы запрещены TOS дискорда.
    Ничего не мешает делать ту же логику обычным ботом.
    Ответ написан
  • Как сделать форму для получение роли, после проверки-одобрения модерации (как на видео)?

    fenrir1121
    @fenrir1121
    Начни с документации
    Написать бота, где будет реализована нужная вам форма и логика. Буквально последний вопрос в разделе discord.py, посвящён той же задаче.

    Либо же найти бота, который уже умеет делать то что вы хотите, но такое бывает редко.
    Ответ написан
  • Dropdown error disnake в чём проблема?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    В чём проблема?
    В том что класс staffapp наследуется от commands.Cog, а не ui.Modal. Эффекта от того что вы сделаете в произвольном классе функцию callback не будет.
    На русском есть очень подробная документация.
    Ответ написан
  • Как получить id (набор цифр) из embed сообщения, используя discord.py?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Текст эмбедов лежит в embed.description или embed.fields. Чтобы извлекать текст пишите регулярку или ищите заданную подстроку в строке, если формат строго определен.
    Ответ написан
    2 комментария
  • Можно ли изменить длинну поля сообщения embeds в вебхуке?

    fenrir1121
    @fenrir1121
    Начни с документации
    Нельзя. Поэтому кто хотят этим заморачиваться делают длинную картинку с горизонтальной линией, узором или чем-то тематичным.

    Далее будет субъективщина, но я не видел ни одного сервера, где было бы приличное подобное оформление. Для теста лучше всего использовать обычные текстовые сообщения, они лучше всего читаются и не едут в зависимости от ширины экрана.
    Ответ написан
  • Почему не работает keras и tensorflow?

    fenrir1121
    @fenrir1121
    Начни с документации
    Потому что для запуска на ГПУ нужен CUDA. На сайте tf даны инструкции для windows и linux вы их читали?
    Ответ написан
    Комментировать
  • Как записать в переменную упоминание пользователя(в Python)?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Упоминание пользователя это обычная строка вида <@user_id>. Любая работа с ней аналогична работе со строками.
    В документации описаны все форматы подробных строк.
    Ответ написан
    Комментировать
  • Возможно ли создать скрипт который перемещает файлы c Linux-машины на Windows-машину?

    fenrir1121
    @fenrir1121
    Начни с документации
    Проблема решается одной командой scp без всяких флешек. Если нужно делать периодически, добавить cron, а если надо синхронизировать папку, заменить решение на rclone
    Ответ написан
  • Disnake как сделать страницы в команде help?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Разделения контента на страницы зовется пагинацией.
    Встроенной в диснейк пагинации нет.
    Писать ее на реакциях это очень плохое решение, пишите на кнопках, для них функционал значительно шире.

    Код как это можно сделать
    class Simple(disnake.ui.View):
        """
        Embed Paginator.
    
        Parameters:
        ----------
        timeout: int
            How long the Paginator should timeout in, after the last interaction. (In seconds) (Overrides default of 60)
        PreviousButton: disnake.ui.Button
            Overrides default previous button.
        NextButton: disnake.ui.Button
            Overrides default next button.
        PageCounterStyle: disnake.ButtonStyle
            Overrides default page counter style.
        InitialPage: int
            Page to start the pagination on.
        """
    
        def __init__(self, *,
                     timeout: int = 60,
                     PreviousButton: disnake.ui.Button = disnake.ui.Button(emoji=disnake.PartialEmoji(name="\U000025c0")),
                     NextButton: disnake.ui.Button = disnake.ui.Button(emoji=disnake.PartialEmoji(name="\U000025b6")),
                     PageCounterStyle: disnake.ButtonStyle = disnake.ButtonStyle.grey,
                     InitialPage: int = 0) -> None:
            self.PreviousButton = PreviousButton
            self.NextButton = NextButton
            self.PageCounterStyle = PageCounterStyle
            self.InitialPage = InitialPage
    
            self.pages = None
            self.ctx = None
            self.message = None
            self.current_page = None
            self.page_counter = None
            self.total_page_count = None
    
            super().__init__(timeout=timeout)
    
        async def start(self, ctx: commands.Context, pages: list[disnake.Embed]):
            self.pages = pages
            self.total_page_count = len(pages)
            self.ctx = ctx
            self.current_page = self.InitialPage
    
            self.PreviousButton.callback = self.previous_button_callback
            self.NextButton.callback = self.next_button_callback
    
            self.page_counter = SimplePaginatorPageCounter(style=self.PageCounterStyle,
                                                           TotalPages=self.total_page_count,
                                                           InitialPage=self.InitialPage)
    
            self.add_item(self.PreviousButton)
            self.add_item(self.page_counter)
            self.add_item(self.NextButton)
    
            self.message = await ctx.send(embed=self.pages[self.InitialPage], view=self)
    
        async def previous(self):
            if self.current_page == 0:
                self.current_page = self.total_page_count - 1
            else:
                self.current_page -= 1
    
            self.page_counter.label = f"{self.current_page + 1}/{self.total_page_count}"
            await self.message.edit(embed=self.pages[self.current_page], view=self)
    
        async def next(self):
            if self.current_page == self.total_page_count - 1:
                self.current_page = 0
            else:
                self.current_page += 1
    
            self.page_counter.label = f"{self.current_page + 1}/{self.total_page_count}"
            await self.message.edit(embed=self.pages[self.current_page], view=self)
    
        async def next_button_callback(self, interaction: disnake.Interaction):
            if interaction.user != self.ctx.author:
                embed = disnake.Embed(description="You cannot control this pagination because you did not execute it.",
                                      color=disnake.Colour.red())
                return await interaction.response.send_message(embed=embed, ephemeral=True)
            await interaction.response.defer()
            await self.next()
    
        async def previous_button_callback(self, interaction: disnake.Interaction):
            if interaction.user != self.ctx.author:
                embed = disnake.Embed(description="You cannot control this pagination because you did not execute it.",
                                      color=disnake.Colour.red())
                return await interaction.response.send_message(embed=embed, ephemeral=True)
            await interaction.response.defer()
            await self.previous()
    
    class SimplePaginatorPageCounter(disnake.ui.Button):
        def __init__(self, style: disnake.ButtonStyle, TotalPages, InitialPage):
            super().__init__(label=f"{InitialPage + 1}/{TotalPages}", style=style, disabled=True)
    Код как использовать
    embeds = [disnake.Embed(title="First embed"),
              disnake.Embed(title="Second embed"),
              disnake.Embed(title="Third embed")]
    
    await Simple().start(ctx, pages=embeds)
    Ответ написан
  • Как вызвать Secret в Dockerfile?

    fenrir1121
    @fenrir1121
    Начни с документации
    Как вызвать Secret в Dockerfile?
    Secrets или multi-stage.

    Вообще не очень понятно зачем вам такой странный образ. Сделайте сборку проекта в контейнер там же где разрабатывали без всяких git clone и сомнительных секретов.
    Ответ написан
    6 комментариев