Ответы пользователя по тегу discord.py
  • Как сделать SelectMenu в котором будут юзеры Discord?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    На офф сайте мне не понятно и нет примеров использования.
    Зато там есть информация, что в меню не может быть больше 25 пунктов.
    Если у вас меньше 25 участников, доставайте их из Guild.memders
    Ответ написан
    Комментировать
  • Как мне добавить команду по которой будет вызываться class MyModal?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Никак. Модальное окно можно выдать только в ответ на взаимодействие, коими реакции не являются.
    Чтобы использовать модальные окна переписывайте на использование кнопок, вместо реакций.
    Ответ написан
    Комментировать
  • Как передать автора модального окна в view?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    interaction.author

    UPD: Просто сделать так не получится, поскольку вторая модалка ничего не знает о первой. Так же как вы храните людей в БД нужно хранить там же связку id кнопки: человек.
    Альтернативный способ хранить информацию о пользователе (ник или айдишник) в тексте эмбеда и читать его оттуда.
    Ответ написан
    8 комментариев
  • Ошибки с discord.ext ipc, как исправить?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Перевести ошибку. От вас ожидается аргумент "клиент".

    Вообще в discord.ext есть только 2 модуля: commands и tasks.
    Если используете какой-то специфичный форк библиотеки, лучше связываться с автором.
    Единственная библиотека, которую я нашёл по фразе discord ipc 3 года как заброшена, а репозиторий в read-only.

    Собственно в репозитории, который вы приложили в issue все описано. Не стоит пытаться писать ботов по туториалам, особенно если им больше одного года.
    скрин issue
    6641050612054947943729.png
    Ответ написан
  • Как сделать чтобы кнопки работали после перезапуска бота?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    prostovladikxd ознакомьтесь с правилами ресурса. Поправьте код в вопросе, чтобы он стал читаемым для этого используйте кнопку </> в панели. В будущем старайтесь внимательней подходить к формулировкам и подкрепляйте их кодом: что еще за кнопки перед модальным окном, где этот код? Куда нужно передать параметр self.author? Почему у вас в вечной вьюхе нужен автор? Почему вы в момент создания не знаете данных?

    Отвечая на непосредственный вопрос: инструкция как сделать вечные кнопки есть в репозитории диснейка. По съеховшему коду не могу точно сказать, но вроде бы все корректно.

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

    По коду который вы приложили повторно создается ощущение, что вам не нужны все эти параметры. Эти данные должны где-то храниться. Если не в базе данных, то в самом сообщении, к которому прикреплена кнопка.
    Ответ написан
    2 комментария
  • Как хранить id сообщений и аттрибуты viev`ов?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Научится работать с базами данных и хранить все данные там. Наиболее простой вариант - sqlite.
    Ответ написан
  • Из за чего пишет "Неизвестная интеграция"?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Ropb4ik код нужно прикладывать в вопрос, а не в комментарии.

    У вас на второй строчке код вероятно падает с ошибкой voice_state = self.get_voice_state(guild_id). Я на 99% уверен, что в вашем классе нет такого метода. Чтобы ответить точно нужен весь код, но чаще всего в когах объект бота лежит в self.bot.
    Разберитесь почему вы не видите ошибки, потому что в консоль, где запущен бот должно все нужное приходить, если только вы их не глушите где-то выше.

    Ну и сразу по последующему коду замечу, что вы не можете вызывать дважды response, потому что ответ можно выдавать только один раз.
    Кроме того писать сообщение в духе "я сделаль" до того как реально что-то сделали дурной тон. Как минимум потому что по причине выше вы могли бы выдать сообщение и упасть с ошибкой на самом деле ничего не сделав.
    Ответ написан
    Комментировать
  • Как локализовать label в декораторе button ui?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Localized работает только для команд и их параметров.

    Для всего остального используйте другое решение и библиотеки, например i18n
    Ответ написан
    Комментировать
  • Не выдаёт роль что делать?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Перевести ошибку. Ни к питону, ни к библиотеке она отношения не имеет.
    Либо у вас не выданы необходимые полномочия боту, либо его роль находится в списке ролей ниже чем роль, которую он должен выдать.

    Чтобы определить какой из двух вариантов случился в вашем случае нужно перестать обрабатывать ошибки принтами и читать Traceback, там все будет написано.
    Ответ написан
    1 комментарий
  • Pycord, как передать сообщение отправленное боту по команде в отдельный канал?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Достаете канал по id через get_channel, отправляете через сhannel.send

    channel_id = ... # достаете из БД или оттуда где у вас хранится id нужного канала
    channel = bot.get_channel(channel_id)
    channel.send(feedback_message.content)
    Ответ написан
    Комментировать
  • Как взять данные с базы данных, в app_commands.Choice?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Для этого используется декоратор autocomplete
    async def fruit_autocomplete(
        interaction: discord.Interaction,
        current: str,
    ) -> List[app_commands.Choice[str]]:
        fruits = ...  # Список данных полученный из БД
        ... # Фильтрация списка 
        return [
            app_commands.Choice(name=fruit, value=fruit)
            for fruit in fruits if current.lower() in fruit.lower()
        ]
    
    @app_commands.command()
    @app_commands.autocomplete(fruit=fruit_autocomplete)
    async def fruits(interaction: discord.Interaction, fruit: str):
        await interaction.response.send_message(f'Your favourite fruit seems to be {fruit}')


    В данном примере функция fruit_autocomplete будет вызываться при наборе каждой буквы. Делаете вместо статичного списка чтение из БД (только убедитесь, что делаете один раз, а не при наборе каждой буквы!) и фильтруете результат на основе текущего ввода, который лежит в current.

    В простейшем виде сравниваете начальные буквы, но можно делать и более интересные вещи, вроде нечеткого поиска, например через расстояние Дамерау-Левенштейна.
    Ответ написан
    Комментировать
  • Timeout работает не так как надо, disnake py, что я делаю не так?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Таймаут под капотом максимально простая функция, работать не так он не может:
    if not (duration is MISSING) ^ (until is MISSING):
        raise ValueError("Exactly one of `duration` and `until` must be provided")
    
    payload: Dict[str, Any] = {}
    
    if duration is not MISSING:
        if duration is None:
            until = None
        elif isinstance(duration, datetime.timedelta):
            until = utils.utcnow() + duration
        else:
            until = utils.utcnow() + datetime.timedelta(seconds=duration)
    
    # at this point `until` cannot be `MISSING`
    payload["communication_disabled_until"] = utils.isoformat_utc(until)
    
    data = await self._state.http.edit_member(self.id, user.id, reason=reason, **payload)
    return Member(data=data, guild=self, state=self._state)


    Поскольку ни в ней, ни в вашем коде нет упоминаний 4 часов, следовательно у вас вызывается какой-то другой код. Добавляйте принты и/или логирование и смотрите ваши данные.

    P.S. Отформатируйте код вопроса через соответствующий тег.
    Ответ написан
    Комментировать
  • Как сделать, чтобы действия были при определённой роли?

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

    Для проверки ролей в checks есть два декоратора checks.has_role и checks.has_any_role

    Применяются следующим образом
    @client.command()
    @app_commands.checks.has_any_role('Library Devs', 'Moderators', 492212595072434186)
    async def cool(interaction: discord.Interaction):
        await interaction.response.send_message('Сообщение увидит только человек с соответствующей ролью')

    Не забудьте обработать ошибки MissingRole и MissingAnyRole чтобы выдавать корректные сообщения об отсутствии прав.

    Почему я считаю что это решение плохое: роли склонны меняться.
    Если это крупный мультисерверный бот, с какими-то кастомными настройками ролей, обычно настройки дополнительно хранятся в БД и роли проверяются по ней в самой команде.

    В общем же виде лучше отталкиваться не от ролей, а от прав, проверка делается через checks.has_permissions, а для более тонкой настройки на сервере зайди в настройки - интеграция и там можно поправить права под каждую команду. В отличии от варианта с ролями это не требует обновлений бота.
    Ответ написан
    Комментировать
  • Как отключить кнопки после нажатия?

    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.

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

    Все ссылки выше ведут на официальную документацию, которая содержить понятные примеры использования. Перепишите все как два отдельных класса: первый содержит команды, второй отвечает за создание и взаимодействие с модальным окном.
    Ответ написан
    Комментировать
  • Бот дискорда падает в 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 комментарий
  • 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 комментария