Задать вопрос
  • Как сделать список людей с определённой ролью?

    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.
    Ответ написан
    Комментировать
  • Как сделать кнопку с выбором ролей?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Это стандартный селектор discord.ui.RoleSelect
    Ответ написан
    Комментировать
  • Как разрешить использование кнопки только определённым ролям?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Для проверки ролей есть checks.has_role для одной роли и checks.has_any_role если нужно чтобы была одна из нескольких ролей.
    Ответ написан
    1 комментарий
  • Тег роли через Disnake бот?

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

    Разрешения на упоминания в боте настраиваются через AllowedMentions и по умолчанию они все проставлены в True.
    Ответ написан
    1 комментарий
  • Что использовать в качестве workerА для отложенных задач?

    fenrir1121
    @fenrir1121
    Начни с документации
    Для длительного хранения нужно использовать базу данных, а не redis или selery.
    Отдельный воркер вообще не обязателен, если нет вычислительных задач.

    Раз в миниту/час/день ходишь в базу и смотришь не наступило ли время выполнения, если наступило выполняешь.

    Можно добавить полезных оптимизаций: засыпать до ближайшего события или до инсерта новых записей, читать сразу батчами, держать ближайшие события в памяти и проверять только их, но в целом не обязательно.
    Ответ написан
    1 комментарий
  • Постоянная ошибка: nextcord.errors.ConnectionClosed: Shard ID None WebSocket closed with 1000. Как решить?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Дискорд примерно раз в 2 часа отключает клиентов с целью балансировки нагрузки. Это нормальное поведение, обработка которого есть в самой библиотеке.
    Если ваше соединение не восстанавливается, вероятно ваш бот не нравится дискорду.
    Ответ написан
  • Как локализировать название и описание слеш команды используя disnake.Locale?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Внимательно читать документацию и корректно соблюдать нейминг.
    Для команд и аргументов в файле с локалью ru.json, должны быть строки вида XYZ_NAME и XYZ_DESCRIPTION.
    Посмотреть пример
    # For this example to work, you need to create a file `locale/de.json` containing the following:
    """
    {
        "HIGHSCORE_COMMAND_NAME": "rekord",
        "HIGHSCORE_COMMAND_DESCRIPTION": "Zeigt die Rekordpunktzahl des Users innerhalb des gewählten Zeitraums.",
        "HIGHSCORE_USER_NAME": "user",
        "HIGHSCORE_USER_DESCRIPTION": "Der User, dessen Punktzahl gezeigt werden soll.",
        "HIGHSCORE_GAME_NAME": "spiel",
        "HIGHSCORE_GAME_DESCRIPTION": "Spiel, für das Punktzahlen gefiltert werden.",
        "HIGHSCORE_RANGE_NAME": "zeitraum",
        "HIGHSCORE_RANGE_DESCRIPTION": "Der Zeitraum zur Berechnung der Rekordpunktzahl.",
    
        "CHOICE_DAY": "Letzter Tag",
        "CHOICE_WEEK": "Letzte Woche",
        "CHOICE_MONTH": "Letzter Monat",
    
        "GAME_TIC-TAC-TOE": "Tic-Tac-Toe",
        "GAME_CHESS": "Schach",
        "GAME_RISK": "Risiko"
    }
    """
    
    
    # localizations need to be loaded before the commands are defined
    bot.i18n.load(f"{os.path.dirname(__file__)}/locale/")
    
    
    @bot.slash_command()
    async def highscore(
        inter: disnake.CommandInteraction,
        user: disnake.User,
        game: str,
        interval: str = commands.Param(
            choices=[
                OptionChoice(Localized("Last Day", key="CHOICE_DAY"), "day"),
                OptionChoice(Localized("Last Week", key="CHOICE_WEEK"), "week"),
                OptionChoice(Localized("Last Month", key="CHOICE_MONTH"), "month"),
            ]
        ),
    ):
        """Shows the highscore of the selected user within the specified interval.
        {{ HIGHSCORE_COMMAND }}
    
        Parameters
        ----------
        user: The user to show data for. {{ HIGHSCORE_USER }}
        game: Which game to check scores in. {{ HIGHSCORE_GAME }}
        interval: The time interval to use. {{ HIGHSCORE_RANGE }}
        """
        db: Any = ...  # a placeholder for an actual database connection
        data = await db.highscores.find(user=user.id, game=game).filter(interval).max()
        await inter.send(f"max: {data}")
    
    
    @highscore.autocomplete("game")
    async def game_autocomp(inter: disnake.CommandInteraction, string: str):
        # this clearly isn't great autocompletion as it autocompletes based on the English name,
        # but for the purposes of this example it'll do
        games = ("Tic-tac-toe", "Chess", "Risk")
        return [
            Localized(game, key=f"GAME_{game.upper()}")
            for game in games
            if string.lower() in game.lower()
        ]
    Ответ написан
    Комментировать
  • Шаблонизаторы Python?

    fenrir1121
    @fenrir1121
    Начни с документации
    Если не считать Django Templates на ум приходит только Mako.

    P.S. меня тоже интересует вопрос какой смысл скрывается за асинхронными шаблонизаторами и в чем проблема Jinja2
    Ответ написан
    Комментировать
  • Как избавиться от ошибки " 'Button' object has no attribute 'guild' "?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Передать аргументы в правильном порядке
    async def open_ticket(self, interaction: discord.Interaction, button: discord.ui.Button):
        ...
    Ответ написан
    1 комментарий
  • Как изменить отправленное Embed сообщение через бота на disnake?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Для редактирования есть единственный метод edit_message, где в embed или embeds будет лежать ваш эмбед. Его нужно изменить или положить новый с измененными данными.

    С эмбедом можно работать через его методы, а можно работать с обычным словарем через методы Embed.to_dict и Embed.from_dict. Структура у него простая и подробно описана в офф документации.

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

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

    Как можно получить того, кто выгнал пользователя из голосового канала?
    Никак.
    Ответ написан
    Комментировать
  • Как "зафиксировать" список в питоне?

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

    Сейчас вы ссылаетесь на один и тот же объект 3 раза, вместо создания нового объекта.
    Исправляется созданием плоской копии списка.
    lst = []
    l = []
    for i in range(3):
        l.append(i)
        lst.append(l[:])
    print(lst)
    Ответ написан
    Комментировать