Ответы пользователя по тегу discord.py
  • Я пишу музыкального бота для Discorda, но выводит ошибки. Не могу понять в чем именно проблема?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же прямым английским текстом написано: ты обращаешься к объекту, описывающему сервер(гильду), и пытаешься у него добыть свойство voice, а такого свойства нет.
    server.voice.channels - получить у объекта сервер свойство voice, а у объекта в этом свойстве - свойство channels.
    И в документации свойства voice у объектов класса Guild тоже нет. Зато есть voice_channels.
    Ответ написан
    Комментировать
  • Что делать при данной ошибке?

    Vindicar
    @Vindicar
    RTFM!
    Вместо
    member_full = bot.get_user(id=id)
    banned_users = await ctx.guild.bans()
    for ban in banned_users: ...

    Нужно
    member_full = bot.get_user(id=id)
    async for ban in ctx.guild.bans(): ...

    async for x in y - это не то же самое, что и for x in await y. Асинхронный генератор (первый случай) каждый элемент запрашивает асинхронно, а во втором случае - асинхронно запрашивается вся коллекция, которая потом синхронно итерируется. Разные подходы, разные методы, так что объект вполне может поддерживать только один из них.
    Ответ написан
    Комментировать
  • Не запускается бот в дискорд, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Всё, что начиная с
    @bot.event 
    async def on_ready():

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

    Vindicar
    @Vindicar
    RTFM!
    for filename in os.listdir("./cogs"):
    Ты ищешь подкаталог cogs в текущем рабочем каталоге программы.
    Это не то же самое, что и каталог, где находится программа.
    Ты уверен, что у тебя путь к нужному каталогу?
    from pathlib import Path
    import sys
    # каталог скрипта
    SCRIPT_DIR = Path(sys.argv[0]).parent.resolve()
    # каталог с когами
    COGS_DIR = SCRIPT_DIR / 'cogs'
    # список имён когов
    COGS = [f.stem for f in COGS_DIR.glob('*.py')]
    Ответ написан
    Комментировать
  • Почему Discord бот перестает отвечать?

    Vindicar
    @Vindicar
    RTFM!
    Может, уже неакутально, но отвечу.

    asyncio.create_task(bot.start(TOKEN))
    Созданный объект-таск может быть тут же собран garbage collector'ом, так как ты не хранишь ссылку на него. Разумеется, при этом сам таск (в твоём случае бот) прибьётся.
    Сохрани возвращаемый create_task() объект хотя бы в локальную переменную.
    Ответ написан
    Комментировать
  • Дискорд бот на питон не видет команды, почему это может быть?

    Vindicar
    @Vindicar
    RTFM!
    Выглядит так, словно ты выдрал кусок кода, который был оформлен как класс-Cog, тупо воткнул его в основной код бота и ожидаешь, что оно волшебным образом само поймёт. Даже отступы не поправил.

    Вот что тут скажешь кроме "выучи язык сначала"?
    Почитай документацию, как пользоваться когами.
    Ответ написан
    Комментировать
  • Как сделать команду которую может использовать только владелец сервера?

    Vindicar
    @Vindicar
    RTFM!
    Читаем доки на has_guild_permissions().
    Similar to has_permissions(), but operates on guild wide permissions instead of the current channel permissions.


    "Работает похоже на has_permissions()"? Окей, тыц по ссылке.
    A check() that is added that checks if the member has all of the permissions necessary.
    Note that this check operates on the current channel permissions, not the guild wide permissions.
    The permissions passed in must be exactly like the properties shown under discord.Permissions.

    И пример кода
    @bot.command()
    @commands.has_permissions(manage_messages=True)  # имя параметра должно быть взято из discord.Permissions
    async def test(ctx):
        await ctx.send('You can manage messages.')

    Тыц по ссылке discord.Permissions, видим большоооой список разрешений. Читаем внимательно, owner нет, но в самом верху есть administrator.
    Значит, нужно has_guild_permissions(administrator=True).

    Делов на две минуты.
    Ответ написан
    1 комментарий
  • Не работают кнопки в discord.py, что делать?

    Vindicar
    @Vindicar
    RTFM!
    @Code.bot.command()
    На момент выполнения этого декоратора класс ещё не закончил создаваться, а значит, не был присвоен имени Code.
    Почитай документацию на либу, как правильно создавать коги и каким декоратором в них отмечать команды.
    Для discord.py это @commands.command().
    Ответ написан
  • Python discord bot, выдача роли по команде пользователю, как сделать?

    Vindicar
    @Vindicar
    RTFM!
    async def role(ctx, target: discord.Member):
    А дальше работаешь с target вместо ctx.message.author, это будет объект-пользователь.
    Причем указывать его можно будет пингом, по id или просто по нику, discord.py (и его клоны) сам разберётся.
    Почитай доку, она полезная.
    Ответ написан
    3 комментария
  • Не понимаю, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Вообще задумайся: если у тебя два многословных ника простым текстом подряд, как программа поймёт, где начинается первый ник, и где кончается второй?
    Я бы или упростил команду (убрал механизм "ответ на сообщение"), или наоборот, опирался бы на этот механизм в первую очередь.

    Вообще discord.py позволяет указывать тип аргумента. Почитай секции "Basic converters", "Discord Converters" и "typing.Union".

    Используя это, ты можешь попробовать схитрить вот так:
    # discord.py попытается сначала интерпретировать первый аргумент как пользователя. 
    # Если не получится - будет просто строка
    async def nick(ctx, arg1: typing.Union[discord.Member, str], *, arg2: str = None):
        if ctx.message.reference is not None and isintance(arg1, str):  # сообщение - это ответ
            member = ctx.message.reference.resolved.author
            # arg1 будет содержать первое слово ника - доклеиваем к нему остальные.
            newnick = f'{arg1} {arg2}' if arg2 is not None else arg1  
        elif ctx.message.reference is None and isintance(arg1, discord.Member) and arg2 is not None:  # сообщение - не ответ
            member, newnick = arg1, arg2
        else:
            ...  # выводим сообщение о неправильном использовании команды
        await member.edit(nick = newnick)


    Не факт что сработает. В этом случае либо требуй ввода упоминания, либо вообще сделай слэш-команду и не парься.
    Ответ написан
  • Что не так с кодом?

    Vindicar
    @Vindicar
    RTFM!
    @bot.event
    async def on_raw_reaction_add(payload):

    Вложенные обработчики событий - очень плохая идея. Это не будет работать так, как ты ожидаешь. Просто не делай так.
    Вместо этого опиши один обработчик on_raw_reaction_add(), и в нём уже определяй, для которого сообщения пришла реакция, и что с этим сообщением делать.
    Ответ написан
    3 комментария
  • Как поставить дискорд бота на питоне на бесплатный хостинг?

    Vindicar
    @Vindicar
    RTFM!
    А тебе супер-принципиально бесплатный? Можно найти хостинг за 40 рублей в месяц, у той же RuVDS. Конечно, всегда есть риск, что за что платишь, то и получишь...
    Ответ написан
    Комментировать
  • Как исправить ошибку взаемодействия Дискорд бота и окна?

    Vindicar
    @Vindicar
    RTFM!
    #
        loop = asyncio.get_event_loop()
        loop.create_task(process_bot_queue())
        loop.run_forever()

    Что вообще вот этот код делает в теле программы, если у тебя вызов create_window() не вернёт управление, пока окно GUI не будет закрыто?
    Ответ написан
    Комментировать
  • Реально ли выдать CoolDown на команду по условию discord py?

    Vindicar
    @Vindicar
    RTFM!
    f"SELECT premium FROM premusers WHERE id = {ctx.guild.id}"

    Используй параметризованные запросы, а не форматирование.

    А что касается кулдауна - достаточно почитать документацию.

    @discord.app_commands.checks.dynamic_cooldown(factory, *, key=...)

    If a factory function is given, it must be a function that accepts a single parameter of type discord.Interaction and must return a Cooldown or None. If None is returned then that cooldown is effectively bypassed.

    Выделение моё.
    Т.е. тебе надо написать функцию, которая принимает объект типа discord.Interaction и возвращает или объект Cooldown, описывающий, какой кулдаун надо применить, или None, если кулдауна быть не должно. Потом передаёшь эту функцию как параметр декоратора dynamic_cooldown, и готово. Пример есть по ссылке.
    Ответ написан
    1 комментарий
  • Что делать если бот дискорд не отвечает на комнды?

    Vindicar
    @Vindicar
    RTFM!
    Если ты используешь не slash commands, а классические команды в сообщениях, то боту нужно иметь доступ к тексту сообщений. А значит, нужен интент guild_messages (и dm_messages для команд в личке).
    Собственно, slash commands для того и ввели, чтобы ботов не оповещать постоянно о болтовне в чате на случай если там вдруг проскользнёт команда.
    Ответ написан
    2 комментария
  • Как получить сообщение с ветки Discord Python?

    Vindicar
    @Vindicar
    RTFM!
    1 работает но получает сообщения со всех каналов и веток.

    Значит, нужно добавить условие, проверяющее message.channel.id на совпадение с заранее заданным.
    Ответ написан
    Комментировать
  • Почему бот для дискорд не отвечает на команды?

    Vindicar
    @Vindicar
    RTFM!
    Проверь intents. Для классических команд (не слэш-команд) нужен интент messages=True.
    Ответ написан
    Комментировать
  • Не видит библиотеку discord, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    1. Не прикреплять код скриншотом. Правила принял не читая?
    2. У тебя в проекте вижу папку виртуального окружения venv. Куда библиотека поставлена: в venv, в системный интерпретатор, в системный но с наследованием в venv? Разберись, что такое виртуальное окружение и как оно работает.
    Ответ написан
    Комментировать
  • Как сделать рандом в дискорде?

    Vindicar
    @Vindicar
    RTFM!
    Изучай стандартную библиотеку языка, в частности, модуль random.
    Ответ написан
    Комментировать