Ответы пользователя по тегу discord.py
  • Почему не отправляется embed сообщение в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же английским по белому пишет: Cannot send an empty message
    Нельзя посылать пустые сообщения, т.е. без текста. Может, раньше и было можно, но теперь нельзя.
    А ты что делаешь?
    await ctx.send(embed = embed)
    Ответ написан
  • Не запускается дискорд бот, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала неплохо бы прочитать документацию!
    client = discord.Client(intents=discord.Intents.default())
    bot = commands.Bot(command_prefix='/', intents=intents)

    Вот на кой тебе сразу и экземпляр Client, и экземпляр Bot, если Bot умеет всё, что умеет Client?
    При этом что ты запускаешь? Сразу же client.run(config.TOKEN)
    Т.е. до всего, что после этой строки выполнение вообще не доходит, так как run() уходит в вечный цикл работы бота.

    Убери всё, что связано с client. Если тебе так надо on_ready() - декорируй его через @bot.event.

    Впрочем, учитывая, что ты не осилил оформить код в редакторе текста на сайте, чтобы сделать твой код читаемым...
    Ответ написан
    Комментировать
  • Помощь с кодом. (discord.py/python), Упоминания в эмбеде?

    Vindicar
    @Vindicar
    RTFM!
    description='Администратор:{message.author.name}\nИгрок:{user.mention}\nВыданная роль:{role}'

    Это не f-строка, это обычная строка, в ней подстановка не выполняется. Ты f забыл в начале.
    Ответ написан
    Комментировать
  • Как запустить сразу несколько аккаунтов в селф боте?

    Vindicar
    @Vindicar
    RTFM!
    1. Один клиент обслуживает один токен, так что нужно сделать несколько экземпляров клиента
    2. Один клиент занимает поток управления для работы, так что несколько клиентов в одном потоке не уместятся. Их придётся запускать в разных потоках.
    3. Очередное "средство массовой рассылки" ваяешь?
    Ответ написан
    Комментировать
  • У мне выдаёт ошибку, что надо сделать?

    Vindicar
    @Vindicar
    RTFM!
    А вот открыть документацию и почитать не пробовал?
    Открой, почитай, и ответь на три вопроса:
    1. Как называется параметр send(), принимающий эмбед?
    2. Как ты называешь этот параметр при вызове send()?
    3. Совпадает ли имя из пункта 2 с именем из пункта 1?
    Ответ написан
    1 комментарий
  • Нужно, чтобы бот из хостинга картинок отправлял рандомную. Как сделать?

    Vindicar
    @Vindicar
    RTFM!
    1. Завести список рандомных картинок.
    2. Использовать на этом списке random.choice().
    3. Отправить то, что она вернёт.
    Ответ написан
    Комментировать
  • В чем ошибка у discord.py и socket?

    Vindicar
    @Vindicar
    RTFM!
    Лови исключения. И привыкай к мысли что любая сетевая операция (да что там, любой ввод-вывод) может завершиться с ошибкой.

    Кроме того, использовать синхронное соединение в асинхронном боте - ну такая себе идея. У тебя бот встанет колом, пока порты не просканятся.
    Ответ написан
    Комментировать
  • Почему при вызове функции guild.members discord.py выводит только один профиль?

    Vindicar
    @Vindicar
    RTFM!
    Интент members задал? Дискорд посылает инфу о пользователях (как профили, так и события входа/выхода) только если бот её явно запрашивает при старте.
    Ответ написан
  • Как сделать чтобы одна команда моего бота дискорд работала только в одном канале, а в других нет Discord - Python?

    Vindicar
    @Vindicar
    RTFM!
    скорее всего по айди канала

    Да. Читай доки на параметр ctx, там есть сведения о канале.
    Ответ написан
  • Discord.py как в команде выполнять задачу для многих аргументов?

    Vindicar
    @Vindicar
    RTFM!
    @bot.command
    asynd def pay(ctx, *args):

    args будет содержать кортеж строк. Проблема в том, что эти строки тебе придётся самостоятельно разбирать и преобразовывать либо в пользователей, либо в суммы.
    Ответ написан
    Комментировать
  • Как правильно записать переменные в функции?

    Vindicar
    @Vindicar
    RTFM!
    В discord.py не слишеом сложные правила разбора строки с командой.
    1. По умолчанию одно слово интерпретируется как один параметр.
    async def command(ctx, a: str, b: str, c:str)
    !command раз два три
    a, b, c == "раз", "два", "три"


    2. Если часть вводимой команды заключена в кавычки, то она интерпретируется как один параметр.
    async def command(ctx, a: str, b: str)
    !command "раз два" три
    a, b == "раз два", "три"


    3. Если последний параметр отмечен как "все позиционные аргументы" (*args), то все последующие слова попадают в него как отдельные элементы.
    async def command(ctx, a: str, *b: str)
    !command раз два три
    a, b == "раз", ("два", "три")


    4. Если последний параметр обозначен как "только ключевое слово" (..., *, param), то остаток строки подаётся в него как есть.
    async def command(ctx, a: str, *, b: str)
    !command раз два три
    a, b == "раз", "два три"


    Таким образом, у тебя есть два выхода.
    а) помещай строку с названием книги в кавычки
    б) поставь название книги последним параметром в своей команде

    EDIT: ниже напомнили, что есть слэш-команды. Посмотри их!
    Ответ написан
    2 комментария
  • Как прописать роль в overwrites?

    Vindicar
    @Vindicar
    RTFM!
    Получи объект роли и укажи его вместо guild.default_role, не?
    Ответ написан
  • Как добавить к сообщению кнопки в дискорд боте в python?

    Vindicar
    @Vindicar
    RTFM!
    Плохо ищешь. Хотя это только для самой новой версии discord.py (её разработку приостанавливали, но вроде возобновили).
    Пример по ссылке с моими комментариями:
    import discord
    from discord.ext import commands 
    
    client=commands.Bot(command_prefix=".")
    
    class Buttons(discord.ui.View):  # класс описывает набор кнопок
        def __init__(self, *, timeout=180):  # конструктор класса
            super().__init__(timeout=timeout)
        # этому методу будет сопоставлена кнопка. По клику метод будет вызван.
        @discord.ui.button(label="Button",style=discord.ButtonStyle.gray)
        async def gray_button(self,button:discord.ui.Button,interaction:discord.Interaction):
            # ищи сведения об объекте discord.Interaction, чтобы понять, что ещё можно сделать в обработчике кнопки.
            await interaction.response.edit_message(content=f"This is an edited button response!")
            # альтернативно, тут ты можешь вызывать требуемые тебе методы и вообще делать что нужно
    
    @client.command()
    async def button(ctx):  # по команде !button отсылается сообщение с кнопками
        await ctx.send(
            "This message has buttons!",  # текст сообщения как обычно
            view=Buttons()  # создаём экземпляр класса Buttons и прикрепляем его
        )
    
    token=""
    client.run(token)  # запуск бота
    Ответ написан
    Комментировать
  • Как вызвать функцию при нажатии на кнопку в discord?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй такой пример (он для новых версий дискорд.пи):
    import discord
    from discord.ext import commands 
    
    client=commands.Bot(command_prefix=".")
    
    class Buttons(discord.ui.View):  # класс описывает набор кнопок
        def __init__(self, *, timeout=180):  # конструктор класса
            super().__init__(timeout=timeout)
        # этому методу будет сопоставлена кнопка. По клику метод будет вызван.
        @discord.ui.button(label="Button",style=discord.ButtonStyle.gray)
        async def gray_button(self,button:discord.ui.Button,interaction:discord.Interaction):
            # ищи сведения об объекте discord.Interaction, чтобы понять, что ещё можно сделать в обработчике кнопки.
            await interaction.response.edit_message(content=f"This is an edited button response!")
            # альтернативно, тут ты можешь вызывать требуемые тебе методы и вообще делать что нужно
    
    @client.command()
    async def button(ctx):  # по команде !button отсылается сообщение с кнопками
        await ctx.send(
            "This message has buttons!",  # текст сообщения как обычно
            view=Buttons()  # создаём экземпляр класса Buttons и прикрепляем его
        )
    
    token=""
    client.run(token)  # запуск бота
    Ответ написан
    Комментировать
  • Как сделать выдачу роли в дискорде по команде?

    Vindicar
    @Vindicar
    RTFM!
    Если нужно выдать указанному пользователю, а не отправителю команды:
    @client.command()
    async def кухня(ctx, member: discord.Member):
        role = discord.utils.get( member.guild.roles, id = 981594840879988807)
        await member.add_roles( role )
    Ответ написан
    4 комментария
  • Не работает JSON в дискорд боте. Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, используй httplib. Она идёт как зависимость к discord.py, так что ставить её отдельно не надо. Зато она асинхронная, и не будет вешать бота на время выполнения запроса.
    Во-вторых, при работе с сетью всегда предполагай подвох! Сайт, к которому ты обращаешься, может тебе ответить сразу, ответить через 5 минут, не ответить вовсе, ответить сообщением об ошибке, или отредиректить на фото задницы - гарантий тут нет, так как ты этот сайт не контролируешь. Поэтому ОБЯЗАТЕЛЬНО лови исключения, и сообщай о произошедшем либо пользователю, либо себе в личку.
    Ответ написан
    Комментировать
  • Как сделать бан по ID в декораторе @bot.event?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужно хранить соответствие между id сообщения и объектом Member пользователя, которого нужно забанить.
    Например, в словаре.
    Тогда команда !ban будет помещать эти сведения в словарь (так как у неё есть доступ к ним), а on_raw_reaction_add() будет проверять наличие id сообщения в словаре.
    Если такой id есть, и реакций достаточно, то принимаем решение о бане, и извлекаем объект Member по этому ключу.
    Если такого id нет, то реакция была поставлена под каким-то другим сообщением, и мы его игнорируем.
    Удалять id сообщения из словаря можно по таймауту - это можно реализовать прямо в обработчике команды. Запостили сообщение, добавили его id в словарь, уснули на пару минут через asyncio.sleep(), проверили наличие id в словаре. Если он там - удалили.

    Реализация несложная, справишься сам. Единственный минус - если бот перезапустится в процессе голосования, то команда не сработает. Но я не думаю, что это большая проблема.
    Ответ написан
    Комментировать
  • Как сделать фильтрацию сообщений?

    Vindicar
    @Vindicar
    RTFM!
    1. Читаешь документацию discord.py насчёт события on_message()
    2. Читаешь документацию насчёт объекта Message и его свойств, в частности channel и его id.
    3. Читаешь документацию насчёт метода delete() у объекта Message.
    4. Комбинируешь полученные знания в одну программу.

    Документация тут.
    Ответ написан
    Комментировать
  • Как создать профили персонажей?

    Vindicar
    @Vindicar
    RTFM!
    1. Определяешь сущности, сведения о которых нужно будет хранить: персонаж, предмет, и т.п.
    2. Определяешь сведения, которые нужно хранить о каждой из сущностей.
    2б. Определяешь способы идентификации каждой сущности - например, назначаешь порядковый номер.
    3. Определяешь связи между персонажами. Например, является ли предмет неотъемлемой частью персонажа?
    3. Осваиваешь какую-нибудь простую ORM, типа peewee или sqlalchemy. Читаешь туториалы, пробуешь написать что-то простое для начала.
    4. Описываешь сущности как модели в рамках ORM. Описываешь связи между ними.
    5. Описываешь операции (скажем, просмотр/создание/удаление персонажа) как запросы к моделям.
    6. Привязываешь операции к командам бота.

    Как-то так.
    Ответ написан
    Комментировать