Задать вопрос
Ответы пользователя по тегу discord.py
  • Как можно запустить бота на discord py и asyncio?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Как можно запустить бота на discord py и asyncio
    Так, как описано в документации библиотеки. Внутри функции run уже есть логика инициализации цикла событий
    import discord
    
    intents = discord.Intents.default()
    intents.message_content = True
    
    client = discord.Client(intents=intents)
    client.run('your token here')


    Если вы хотите самостоятельно им управлять есть функция start(), но в вашем варианте вы не получаете вообще никаких преимуществ, следовательно, все это не нужно. Обычно так делают если хотят вызывать бота в уже существующем цикле событий (и потом страдать). Для этого нужен asyncio.create_task(bot.start(token=token)

    Подробно с комментариями бот в виде кастомного класса описан тут.

    Task exception was never retrieved

    Цикл событий завершается с исключением, которое вы не обрабатываете. А исключение вызывается, потому что start не принимает то, что вы пытаетесь в него передать *args

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

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    В коде все так, это базовый код бота.
    Чтобы бот можно было добавить в мои приложения нужно выставить галку в настройках на портале для разработчиков: Installation - Installation Contexts - User install
    Ответ написан
    Комментировать
  • Как сделать команду help?

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

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

    Во-первых стоит прочитать сообщение Дэнни (автора библиотеки), на которое он сам ссылается при подобных ответах.
    При этом подходе запуская два бота в одном цикле событий у вас не будут работать ивенты.

    Второй подход, это запустить оба бота как подпроцессы с общением через каналы или очереди.
    При этом подходе оба бота будут конкурировать за доступ потому что GIL.

    Третий и наиболее адекватный подход в том, чтобы 2 независимых бота общались через шину данных, например RabbitMQ.
    Ответ написан
  • Можно ли реализовать custom bot на discord.py?

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

    Наблюдаемость, балансировку нагрузки и обновления оставлю за кадром, для этого нужны более конкретные вопросы.
    Ответ написан
    Комментировать
  • Почему кнопка не взаимодействует спустя время?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Нужно прочитать про persistant view или посмотреть в примерах использования библиотеки. Вот ссылка на документацию.
    Ответ написан
  • Disnake | Как корректно использовать UserCommands?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    после установки бота на учётную запись команды не отображаются
    При чем тут установка бота? Где не отображаются?
    UserCommand это команды, выполняемые через контекстное меню -> Приложения.

    В приложенном коде проблем нет, следовательно или у вас не загружен ког в основном файле, либо вы не так понимаете что такое пользовательские команды и не там смотрите.
    Ответ написан
    1 комментарий
  • Как сделать таймаут более 28 дней?

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

    В целом сделать можно, но самому и понадобится БД. Достаточно хранить пользователя, дату когда нужно обновить таймаут (те самые 28 дней) и реальное окончание. Раз в сутки пробегаться по записям и обновлять таймаут для тех, где дата обновления это сегодня (еще +28 или реальный таймаут, смотря что меньше)
    Ответ написан
  • Как сделать так, что-бы когда игрок писал команду /markov, бот отправлял случайное сообщение discord.py составленное цепями маркова?

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

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

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Как реализовать работу бота на нескольких серверах Discord с вводом команды?
    Использовать базу данных. Удалить все глобалы.
    Не хотелось бы использовать базу данных
    А придется.
    Ответ написан
    1 комментарий
  • Почему код создаёт 5 тикетов вместо одного?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Код который вы приложили создаёт 1 канал и отправляет 1 ответ и 2 сообщения.
    Никаких пяти тикетов в нём нет.

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

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

    Переписывайте используя реальную базу данных.
    Ответ написан
    1 комментарий
  • Что лучше вытаскивать данные из БД(sqlite) или хранить в неких переменных?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Что лучше вытаскивать данные из БД(sqlite) или хранить в неких переменных?
    Если данные критичные и недопустима их потеря - хранить в БД, если допустимо их потерять из-за ошибок, отключений и прочего - хранить в переменных. Если и то и то, накапливать какое-то количество данных и скидывать в БД сразу батчем по таймеру или по достижению определенного размера.

    async def on_message(self, message: Message): ...
    on_message это событие, которое срабатывает на каждое сообщение, каждого пользователя. На среднего размера боте с несколькими сотнями серверов в активное вечернее время оно может дергаться тысячи раз в секунду, как сами думаете, насколько адекватно в таком событии ходить в базу? Насколько часто меняются каналы, чтобы каждый раз их доставать из БД? Знаешь ли условия, при которых данные в базе меняются и их нужно повторно перечитать?

    guild_id = message.guild.id
    Как думаете, что лежит в guild, если боту пишут в личные сообщения?

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

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

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    В Dev центре в разделе Installation разрешить User Install. После этого пользователь добавивший себе бота может использовать ApplicationCommands.
    как это выглядит

    6704a39437ef4511623649.png
    Ответ написан
    Комментировать
  • Как сделать так что бы можно было редактировать уже отправленный Embed с содержимым в Modal в библиотеке disnake?

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

    Его и так можно редактировать. Эмбед до отправки и после ничем не отличается, это просто абстракция над json'ом.
    - Вам нужно как-то (вероятно по id) получить сообщение в котором он лежит, скорее всего это InteractionMessage
    - В нем есть атрибут embeds, где лежит список текущих эмбедов и метод edit для редактирования, который тоже может принимать embeds.
    - Те эмбеды, что вы передадите в edit, заменят текущие.
    Ответ написан
    Комментировать
  • Бот не включает музыку discord.py. Что делать?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Если нет ошибок убедитесь что код вообще вызывается и что вы не глушите ошибки.
    FFmpegPCMAudio их возвращает либо если у вас не найден ffmpeg в системе, либо если не найден файл.
    Ответ написан
  • Как вывести время отката команды?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Способ с on_command_error почти верный, только ошибки слеш команд попадают в событие on_slash_command_error
    Ответ написан
  • Почему role = None?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Открываем доки, читаем:
    get_role(role_id, /)
    Parameters
    role_id (int) – The ID to search for.
    Returns
    The role or None if not found.

    ID роли вы достаете из собственной фукнции db_levels.get_id_role, следовательно вооружаетесь дебагером или принтами и изучаете, почему оттуда приходит какая-то роль, которую дискорд не может найти.
    Ответ написан
  • Как сделать, чтобы после выбора в disnake.ui.StringSelect отображалось имя меню?

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

    Если использую edit_original_response то выводит ошибку.
    Если я правильно вас понял, вы после операций во втором сообщении хотите поправить первое. Второе о первом вообще ничего не знает. До вызова inter.response.send_message можно получить сообщение из inter.message, сохранить id и затем его отредактировать.
    Ответ написан
    3 комментария
  • Забивается ли память бота от некоторых активных классов?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Забивается. А что вы хотите делать с этой информацией?

    Для начала disnake.ui.View это класс для создания вью, а не ее представление.
    Далее если очень упрощенно вью состоит из id, childrens и timeout_task.
    - По id определяется что-за формочка нажата
    - В childrens хранятся коллбеки на все функции, которые должны быть вызваны при операциях со всеми элементами на ней
    - timeout_task это корутина, которая спит timeout секунд, а дальше прибивает вью.

    В питоне очистка памяти осуществляется через счетчик ссылок на объект и поиск циклических ссылок, поэтому естественно пока она не прибита на все это будут ссылки и следовательно они будут висеть в памяти.

    Я напомню, что discord.py в целом кэширует данные по командам, серверам, пользователям и сообщениям, чтобы уменьшить обращения к API дискорда, так что может просто памяти докинуть, а не лезть в эту кроличью нору?
    Ответ написан
    6 комментариев