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

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Не стоит привязываться к ошибкам библиотеки. Создаете кастомную ошибку и вызываете в месте возникновения.
    Сейчас вы привязываете к стандартным ошибкам текст, который в реальности не отражает проблему: скажем отсутствие разрешений это MissingPermissions или BotMissingPermissions. BadArgument это ошибка разбора аргументов.

    Ну и не нужно дергать вызов ошибок в событии предназначенном для их обработки.
    async def on_command_error(error, ctx):
        if isinstance(error, commands.BadArgument):
            await ctx.send("Запрос команды с ошибочным аргументом")
        elif isinstance(error, commands.CommandNotFound):
            await Client.send_message(ctx.message.channel, "Команда не найдена")
        ... # вставлять новые проверки сюда
        else:
            await Client.send_message(ctx.message.channel, "Неизвестная ошибка")
    Ответ написан
    Комментировать
  • Как сделать чтобы кнопка работала даже после перезапуска бота?

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

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Потому что при result is None and chann is not None inviter_id будет None.
    inviter_id = None
    if result is not None:
       ... 
    
    if chann:
        embed = nextcord.Embed(
            title='Leafy InviteLogger',
            description=f'{member.mention} join the server!\n\n Invited by <@{inviter_id}>\n Total invitations {total_invites}',
            colour=0x2b2d31
        )


    P.S. Отредактируйте вопрос в соответствии с правилами ресурса. Используйте спойлер для портянок и изображений.
    Ответ написан
  • Что делать ошибка после возрата?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Переводим ошибку
    coroutine 'ApplicationContext.respond' was never awaited

    Смотрим на строку, которая эту ошибку вызывает
    ctx.respond(f'Вы уже использовали {us} из {kyp}',ephemeral=True)

    Сравниваем с вашим же кодом на 10 строк нижe
    await ctx.respond(embed=embedvar,ephemeral=True)
    Играем в игру "найди одно ключевое отличие", добавляем в код await

    С учетом того, что у библиотеки discord.py нет объектов ApplicationContext, похоже код использует какой-то форк и такие вещи стоит указывать.
    Ответ написан
    Комментировать
  • Guild.members не возвращает список всех участников сервера. Что делать?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Вам не дадут всех участников всех серверов. А если вы расчитываете когда-то получить верификацию, учитывайте что вам могут вообще не дать смотреть участников.
    650aa23f17855437585678.png
    1. Никогда не пишите в БД в on_ready. Вы миллион раз будете запускать бота и он миллион раз будет писать миллион пользователей
    2. Не храните пустых пользователей. 99% участников серверов не воспользуются вашим ботом никогда, зачем вы их храните?
    3. Добавляйте запись когда в ней есть необходимость, используйте INSERT ... ON CONFLICT ... UPDATE
    Ответ написан
    Комментировать
  • Как убрать строку между name и value в embed.add_field - disnake.py?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Никак.
    Name и Value всегда на разные строках так же как Title и Description.
    Если текст должен быть в одной строке просто положите его в одно поле.

    P.S. поправьте текст вопроса.
    Ответ написан
    Комментировать
  • Не работает on_member_join Как исправить?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Не работает on_member_join?

    on_member_join работает, не работает ваш код. Вероятно channel is None, поскольку этой ветки у вас нет вам об этом и не сообщается.

    1. Поправьте вопрос как описано в сообщении модератора

    2. Проверяйте типы объектов, которыми оперируете и делайте все возможные ветвления, если код работает не как ожидается.

    3. Открывайте документацию

    4. Для приветственных сообщений есть системный канал, который рекомендуется под это использовать.
    Хардкод это плохая практика.

    import discord
    
    class MyClient(discord.Client):
        async def on_member_join(self, member):
            guild = member.guild
            if guild.system_channel is not None:
                msg = f'{member.mention} добро пожаловать на сервер {guild.name}!'
                await guild.system_channel.send(msg)
    
    
    intents = discord.Intents.default()
    intents.members = True
    
    client = MyClient(intents=intents)
    client.run('token')
    Ответ написан
    Комментировать
  • Приложение не отвечает?

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

    Без отступов нельзя сказать на 100%, но вероятно дело в том, что у вас в середине функции что-то забыл return, после которого ничего не выполнится.
    Ответ написан
    1 комментарий
  • Как настроить использование слэш-команды в конкретном канале (disnake)?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Это можно сделать, только не в параметрах.
    Можно либо где-нибудь в БД хранить разрешенные id каналов и повесить check на команду (предпочительно, если бот на много серверов)
    Или собственно в настройках сервера -> Интеграция выставить в каких каналах она должна быть доступна (если бот на одном сервере). В этом случае в коде вообще ничего делать не нужно.
    Ответ написан
    Комментировать
  • Не работает код Discord.py?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Не работает код Discord.py?
    Да не работает.

    библиотеки нужные я установил
    Значит не установили, иначе yarl бы подтянулся
    ➜  ~ (test) pip install discord
    ...
    ➜  ~ (test) pip freeze | cat
    aiohttp==3.8.5
    aiosignal==1.3.1
    async-timeout==4.0.3
    attrs==23.1.0
    charset-normalizer==3.2.0
    discord==2.3.2
    discord.py==2.3.2
    frozenlist==1.4.0
    idna==3.4
    multidict==6.0.4
    yarl==1.9.2


    Python 3.1.1
    Что правда 3.1.1?

    Смотрите что и как наустанавливали.
    Ответ написан
    Комментировать
  • Как сделать команду которую может использовать только владелец сервера?

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

    Владельца можно получить из ctx.guild.owner_id
    # checks.py
    from discord.ext import commands
    def is_owner():
        async def predicate(ctx: commands.Context) -> bool:
            return ctx.author.id == ctx.guild.owner_id:
        return commands.check(predicate)


    и используем аналогично дискордовским
    @bot.command()
    @checks.is_owner()
    async def test(ctx):
        await ctx.send('You can manage messages.')
    Ответ написан
    Комментировать
  • Как внедрить меню dropdown?

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

    (желательно ответьте куском кода )

    Код из примера
    import discord
    from discord.ext import commands
    
    class Dropdown(discord.ui.Select):
        def __init__(self):
            options = [
                discord.SelectOption(label='Red', description='Your favourite colour is red', emoji=''),
                discord.SelectOption(label='Green', description='Your favourite colour is green', emoji=''),
                discord.SelectOption(label='Blue', description='Your favourite colour is blue', emoji=''),
            ]
            super().__init__(placeholder='Choose your favourite colour...', min_values=1, max_values=1, options=options)
    
        async def callback(self, interaction: discord.Interaction):
            await interaction.response.send_message(f'Your favourite colour is {self.values[0]}')
    
    
    class DropdownView(discord.ui.View):
        def __init__(self):
            super().__init__()
            self.add_item(Dropdown())
    
    
    class Bot(commands.Bot):
        def __init__(self):
            intents = discord.Intents.default()
            intents.message_content = True
    
            super().__init__(command_prefix=commands.when_mentioned_or('$'), intents=intents)
    
        async def on_ready(self):
            print(f'Logged in as {self.user} (ID: {self.user.id})')
            print('------')
    
    
    bot = Bot()
    
    
    @bot.command()
    async def colour(ctx):
        view = DropdownView()
        await ctx.send('Pick your favourite colour:', view=view)
    
    bot.run('token')
    Ответ написан
    Комментировать
  • Как создать слеш команды на discord.py?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Многие используют from discord_slash import SlashCommand
    Смелое заявление о библиотеке, которая не обновлялась с 2021 года. У нее уже даже архивный репозиторий удалили и ссылка ведет на interactions.py.

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

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Вероятно вы выключали бота в этом случае логика никогда не отработает.
    Необходимо хранить подобную информацию в БД. Кроме того для есть discord.ext.tasks, чтобы периодически в фоне запускать что-либо.
    Ответ написан
  • Хочу сделать мьют на discord.py duration reason?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Сам мут.
    @bot.command
    async def mute(ctx, member: discord.Member):
        await member.edit(mute=True)

    Чтобы он был на время реализуйте отложенную задачу, которая будет его снимать. Для небольших периодических задач у дискорда есть свой ext.tasks, но чтобы задачи не исчезали в случае перезапуска бота нужна своя реализация с хранением данных в БД.
    Ответ написан
    Комментировать
  • Как убрать "Ошибка взаимодействия" при нажатии на кнопку в Discord?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    В каких дебрях интернета вы нашли этот код?
    Где вы увидели использование слеша в качестве префикса? Этому какой-то ютубер учит?
    В актуальной версии библиотеки discord.py нет события on_button_click. А у вас намешаны в одну кучу контексты и взаимодействия, которые являются принципиально разными.

    Удалите весь код, никогда не заходите туда, где его нашли (или смотрите дату публикации).
    Откройте официальную документацию, getting-started и пишите по ней заново.
    Ответ написан
    1 комментарий
  • При исполнения команды, бот отправляет GIF файл, который не грузит discord, в чем проблема?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    В списке в перемешку ссылки на веб страницы и на mp4 видео.
    set_image требует как это ни странно изображение.
    Чтобы приложить видео есть аналогичный атрибут Embed.video, а ссылку на сайт можно разве что в текст засунуть.

    P.S. не используйте столько тегов, оставляйте только ключевой, в данном случае discord.py
    Ответ написан
  • Не блокирует человека discord.py?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Команда верная. Если убрать лишнее она сводится к одной строчке.
    @client.command()
    @commands.has_permissions(ban_members = True)
    async def ban(ctx, member : discord.Member, *, reason = None):
        await member.ban(reason = reason)


    А не работает, поскольку в функции нигде не определен объект userName у которого вы пытаетесь вызвать метод send. Что впрочем вам должно было бы писаться, если только вы не глушите любые ошибки
    Ответ написан
    Комментировать
  • Почему когда загружаю коги через команду они не работают(слеш команды) nextcord?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Слеш команды полностью отличаются от префиксных.
    Если префиксные запустил бота и они работают, то в случае со слешами они синхронизируются на стороне серверов дискорда и до этого момента они не работают. Соответственно для синхронизации команд есть функции sync_application_commands, sync_all_application_commands, discover_application_commands и еще несколько.

    Для того чтобы можно было тестировать их можно дополнительно передавать в команду guild_ids=[TESTING_GUILD_ID], но и в этом случае команды нужно синхронизировать.
    Ответ написан
    Комментировать
  • Как отключить кнопки?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Чтобы кнопка изменилась необходимо отредактировать сообщение с ними.
    Для этого есть метод Interaction.edit_original_message, куда нужно передать view с обновленными кнопками

    В документации дан пример, где выполняется схожая логика и все снабжено комментариями
    @disnake.ui.button(label="Disable the view", style=disnake.ButtonStyle.grey)
    async def disable_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
        # We disable every single component in this view
        for child in self.children:
            if isinstance(child, disnake.ui.Button):
                child.disabled = True
        # make sure to update the message with the new buttons
        await inter.response.edit_message(view=self)
    Ответ написан