Задать вопрос
  • Как вывести время отката команды?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Способ с on_command_error почти верный, только ошибки слеш команд попадают в событие on_slash_command_error
    Ответ написан
  • Как сделать Monkey patch для AsyncIO debug mode для детальной информации?

    fenrir1121
    @fenrir1121
    Начни с документации
    Поскольку судя по описанию задача найти проблему, порекомендую готовый инструмент yappi для профилирования асинк кода, чтобы не городить свой.
    Ответ написан
  • Почему 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 комментария
  • Бинарный поиск. Правильно ли работает?

    fenrir1121
    @fenrir1121
    Начни с документации
    Нет, не правильно.
    1) Возвращается значение, вместо индекса
    2) На пустом массиве будет ошибка
    К алгоритму не относится, но т.к реализовано на питоне
    3) list это ключевое слово в языке, крайне не рекомендуется его переопределять.
    Ответ написан
    1 комментарий
  • Почему 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
    Начни с документации
    Обернуть data как кусок кода ```json ... ```
    Ответ написан
    Комментировать
  • Как использовать команду через кнопку в боте Discord?

    fenrir1121
    @fenrir1121
    Начни с документации
    В модальном окне нельзя упоминать пользователей. Вернее там не будет работать автодополнение, просто айдишник как строку конечно можно ввести.
    Вводить текст за пользователя тоже нельзя.

    Судя по описанию подходят Application Commands.
    Либо учите пользователей вводить слеш-команды, в них использовать упоминания можно.
    Ответ написан
  • Как создать образ докер для чтения input?

    fenrir1121
    @fenrir1121
    Начни с документации
    скрипт нужно запускать на пк, где нет пайтона и пр.
    А зачем тогда в шапку выносите вопрос "Как создать образ докер для чтения input?"
    Вместо проблемы доставки питона переходите к более сложной проблеме доставки докера, для которого нужен включенный WSL.

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

    Быстрый способ использовать костыли в виде py2exe или других утилит для создания исполняемых файлов.
    Ответ написан
    1 комментарий
  • Как сделать список людей с определённой ролью?

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

    fenrir1121
    @fenrir1121
    Начни с документации
    Засовывать всё в докер, и сразу писать compose-файл? Но можно ли это всё потом интегрировать с IDE?
    Да все верно. В нижней панели, там же где терминал и питон консоль есть вкладка Services, там и логи и управление всеми запущенными (микро)сервисами.
    В compose достаточно стрелку ткнуть, он тебя первый раз попросить конфиг настроить и все.
    66c8250c766ad116037154.png

    Так же можно с ssh работать так что можно хоть локально запускать, хоть на удаленной машине
    66c8269e763a0228875878.png
    Ответ написан
    Комментировать
  • Как правильно использовать 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 комментария
  • Как сделать страницы в модальных окнах disnake?

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

    А вообще для опросов есть отдельные сервисы, не обязательно забивать гвозди отвёрткой.
    Ответ написан
    3 комментария
  • Как сделать временный бан в Disnake с базой данных SQLite?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    1) Записать в БД время, когда нужно разбанить и id пользователя
    2) Сделать обычный бан
    3) Периодически (скажем раз в минуту) ходить в базу и доставать записи для которых время разбана меньше текущего времени
    4) Выполнить разбан всех полученных id, удалить записи из БД

    sqlite не имеет встроенного формата для дат и времени, так что я бы рекомендовал хранить время как INT, преобразуя datetime в timestamp.
    Ответ написан
    Комментировать