Задать вопрос
Ответы пользователя по тегу discord.py
  • Как сделать так, что-бы когда игрок писал команду /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 комментариев
  • Можно ли создать cogs для событий?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Вы прочитали гайд по библиотеке? Он у них есть.
    Для слушания событий в когах есть Cog.listener
    Ответ написан
    2 комментария
  • Почему event on_member_join не работает?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Вероятно на портале для разработчиков не включено соответствующее разрешение
    1LCiuFF.png

    В коде проблем нет, хотя он несколько мудреный. Если хочется структурировать события, для этого стоит использовать disnake.Client
    import disnake
    
    class MyClient(disnake.Client):
        async def on_member_join(self, member: disnake.Member):
            guild = member.guild
            if guild.system_channel:
                to_send = f"Welcome {member.mention} to {guild.name}!"
                await guild.system_channel.send(to_send)
    
        async def on_ready(self):
            print(f"Logged in as {self.user} (ID: {self.user.id})\n------")
    
    intents = disnake.Intents.default()
    intents.members = True
    
    if __name__ == "__main__":
        client = MyClient(intents=intents)
        client.run(os.getenv("BOT_TOKEN"))
    Ответ написан
    4 комментария
  • Как сделать список людей с определённой ролью?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Прочитать документацию Role.members
    Ответ написан
    Комментировать
  • Как правильно использовать option в disnake?

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

    Ну, а вообще вы пытаетесь заявить, что amount должен иметь тип Option, тогда как он должен быть интом. Disnake под капотом пытается выполнять приведение типов согласно аннотациям
    amount: int = Option(...)

    Ну и если я правильно понял что вы делаете что-то такое
    import disnake
    from disnake.ext import commands
    
    @bot.slash_command()
    async def clear(
        inter: disnake.CommandInteraction,
        amount: commands.Range[int, 1, 5],
    ):
        ...
    Ответ написан
    Комментировать
  • Как сделать анимированные эмодзи disnake?

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

    Следовательно вашего бота нет на сервере, эмоздзи которого вы пытаетесь использовать.
    Ответ написан
    Комментировать
  • Как импортировать options из disnake?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Вы определитесь с тем, что вы нашли: options, Options, или Option.

    В диснейке есть только третий вариант - disnake.Option, по всем остальным вариантам идите туда, где вы их нашли.
    Ответ написан
  • Многостраничные модальные окна disnake?

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

    Нет и не будет. Нет ничего сложного, но модальные окна для этого не приспособлены так что надо писать свои велосипеды.
    Делаете обычную форму #1, по закрытию сохраняете куда хотите и редактируете сообщение, добавляя кнопку ведущую на форму #2, повторяете N раз.
    Ответ написан
    Комментировать
  • Как сократить код?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Такое количество запросов к БД с коммитами это кошмар.

    on_message это событие которые вызывается на каждое отправленное сообщение и в нём не рекомендуется использовать никаких запросов к БД.

    В событии максимум стоит накапливать информацию скажем в словаре, а по кулдауну (например раз в минуту) читать весь словарь и пачкой обновлять записи в базе одним коммитом.
    Ответ написан
    4 комментария