Задать вопрос
  • Как импортировать 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)
    Ответ написан
    Комментировать
  • Как обновить конфигурацию оконного менеджера без ребута?

    fenrir1121
    @fenrir1121
    Начни с документации
    Да, я пытался искать его в sxhkdrc хоткеях и в ридмишках софта, но там его нет.

    Потому что для ребута нужно его просто убить.
    Достаточно использовать команды в терминале, не обязательно хоткеи.
    # make sxhkd reload:
    super + Escape
    	pkill -USR1 -x sxhkd
    
    # quit/restart bspwm
    super + shift + {Escape}
    	bspc {quit}
    Ответ написан
    Комментировать
  • Как поменять формат времени в сообщении discord бота?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Тебе нужен discord timestamp в формате Relative time
    Ответ написан
    1 комментарий
  • Пожалуйста объясните мне как сделать систему прав?

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

    В общем виде не нужно никакую информацию по правам хранить в БД. Стандартные правила создания команд подразумевают, что человек применяющий команду должен иметь права, которые требуются для использования действия исполняемого ботом: если хочешь выгнать участника командой для этой команды должна стоять проверка соответствующих прав у вызывающего участника. Для всего этого есть соответствующие декораторы, которые вешаются на команду. Изучите все что есть в checks, вроде checks.has_permissions()

    Когда же речь заходит о каких-то тонких настройках(например действие команды только в отдельном канале отдельной ролью) для этого прямо в дискорде есть раздел Настройки - Интеграция - Нужный бот, который позволяет эти настройки делать на уровне сервера, а не вносить их в код. Это удобнее и бот не будет прибит костыльными гвоздями к одному серверу.
    Ответ написан
  • Где возможно посмотреть количество Telegram звёзд которые получены от продаж в боте?

    fenrir1121
    @fenrir1121
    Начни с документации
    • Вкладка «Монетизация» доступна в разделе статистики канала только в том случае, если хотя бы половина подписчиков канала имеет телефонные номера, выданные не в России, Украине, Палестине, Израиле или Германии, а общее число подписчиков канала превышает 1000. Местонахождение владельца канала и номер телефона его аккаунта никак не влияют на отображение вкладки «Монетизация».


    Источник kod.ru
    Ответ написан