Задать вопрос
Ответы пользователя по тегу discord.py
  • Можно ли создать 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 комментария
  • Как сделать страницы в модальных окнах 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 комментарий
  • Постоянная ошибка: 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()
        ]
    Ответ написан
    Комментировать
  • Как избавиться от ошибки " '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
    Начни с документации
    Всем привет, я знаю, то что нельзя отследить того, кто выгнал пользователя из голосового канала
    Да нельзя.

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

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

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

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

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