Задать вопрос
Ответы пользователя по тегу Боты
  • Как считать время (кулдаун) для команды?

    Vindicar
    @Vindicar
    RTFM!
    Неправильная архитектура.
    Тебе незачем отсчитывать время постоянно - просто запомни, когда команда была отправлена данным пользователем, и при следующем запуске этой команды проверь запомненное предыдущее время отправки и сверь его с текущим. Если разница больше кулдауна, можно выполнять команду снова.
    Ответ написан
  • Проблема с произведением музыки в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ну подумай головой.
    > 'NoneType' object has no attribute 'play'
    > voice_channel.play(
    Значит, voice_channel - None.
    Смотрим откуда он взялся, читаем доки по Guild.voice_client:
    "voice_client - Returns the VoiceProtocol associated with this guild, if any.
    Type: Optional[VoiceProtocol]"
    Т.е. он вполне может быть None, и это надо проверять перед использованием.

    А вот более интересный вопрос, почему он None.
    Ты выше обращаешься к channel = ctx.author.voice.channel - а ведь не только voice может быть None, но и channel в нём. voice проверяешь, channel нет. А чуть ниже у тебя удивительная конструкция:
    try:
          await channel.connect()
        except:
          pass

    Дай угадаю, channel.connect() кидал 'NoneType' object has no attribute 'connect'?
    Никогда на надо глотать исключения таким образом - всё без разбора и без реакции.
    channel.connect() кидает ровно три возможных исключения, и их нужно обрабатывать по-нормальному!
    asyncio.TimeoutError – серверу икнулось, мы ничего сделать не можем, только попросить пользователя повторить по-позже.
    ClientException – мы уже к войс-чату подключены, нужно либо переключаться, либо просить подождать, пока закончим с первым запросом.
    OpusNotLoaded – библиотеку opus не загрузил, она нужна для работы с голосом.
    Ещё раз, except: pass - это очень, очень хороший способ выстрелить себе в ногу.

    И самое-то смешное, что в документации на connect() написано что оно возвращает готовый к работе voice_channel. Тогда вроде как не нужно было ctx.guild.voice_client трогать, connect() отдаст нужный объект.
    Ответ написан
    Комментировать
  • Как изменять переменную через время в боте VK?

    Vindicar
    @Vindicar
    RTFM!
    Храни в базе пары "ID пользователя" - "время предыдущей отправки команды", при отправке команды вытаскивать по ID отправившего прошлое время и смотреть сколько с тех пор времени прошло.

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

    Vindicar
    @Vindicar
    RTFM!
    Тебе придётся реализовать state machine (оно же конечный автомат) самому. Это не так уж сложно, погугли.
    Если коротко: есть список состояний (шагов, на которых может находиться пользователь), есть список переходов между состояниями. Каждому переходу сопоставлена кнопка.
    Когда пользователь входит в состояние, выведи кнопки, соответствующие всем переходам из этого состояния. Когда пользователь нажимает кнопку, перейди в состояние, помеченное как конец соответствующего перехода.
    Текущее состояние нужно хранить для каждого пользователя отдельно. По-хорошему это надо делать в БД (чтобы состояния пережили перезапуск бота), но обучения ради можно и в памяти, просто в словаре вида user_id:state_id.
    Ответ написан
    Комментировать
  • Как сделать покупку валюты в боте Discord?

    Vindicar
    @Vindicar
    RTFM!
    Если API представляет все необходимые для этого операции, вы можете им воспользоваться и это не противоречит законодательству - то можно.
    Все три "если" - это вопросы, на которые нужно знать ответ.

    Предполагая что первое и третье предположения верны, техническая сторона дела проблем не составит.
    Ответ написан
    Комментировать
  • Как заблокировать человека в боте?

    Vindicar
    @Vindicar
    RTFM!
    Храни список (в файле, а лучше в базе данных) ID заблокированных, при поступлении команды проверяй что ID отправителя сообщения нет в списке.

    Опциональные фишки типа хранения причины бана или даты, когда истекает бан, по желанию.
    Ответ написан
    Комментировать
  • Как заставить бота ждать ответа от пользователя?

    Vindicar
    @Vindicar
    RTFM!
    Если нужно обрабатывать последовательность сообщений, описывай автомат состояний.
    Каждое состояние - это ситуация, когда бот ожидает некий набор возможных ответов.
    Каждый ответ - это переход из состояния в состояние.
    При обработке сообщения смотришь, какие переходы есть в текущем состоянии, выбираешь наиболее подходящий и выполняешь его логику.
    Ответ написан
  • Как можно сделать бонус раз в 24 часа?

    Vindicar
    @Vindicar
    RTFM!
    Фиксируешь время нажатия на кнопку.
    Выбираешь из базы значение предыдущего времени по id пользотеля запросом SELECT.

    Если значения нет, человек пишет в первый раз, заносим значение времени и id пользователя в базу запросом INSERT. Отправляем сообщение о бонусе.

    Если значение есть, и разница между ним и текущим временем более 24 часов, человек может получить бонус. Обновляем значение в базе запросом UPDATE и отправляем сообщение о бонусе.

    Если значение есть, и разница менее 24 часов, отправляем сообщение с оставшимся до следующего бонуса временем.
    Ответ написан
  • Как сделать текстовую игру в стиле бота в телеграмме на языке python?

    Vindicar
    @Vindicar
    RTFM!
    Учи, что такое конечные автоматы, и как их реализовывать. По сути, это тебе даст необходимую базу для реализации игры. Каждый сюжетный шаг будет состоянием, а действия игрока - переходами.

    Есть несколько способов их реализации, хорошо подумай, какой удобнее. Например, вариант с матрицей переходов будет работать плохо.
    Ответ написан
    Комментировать
  • Как cделать доступ к команде только для меня?

    Vindicar
    @Vindicar
    RTFM!
    Если "только для меня" = "только для владельца бота", то discord.ext.commands.is_owner(). Можно использовать как декоратор для обработчика команды.
    Ответ написан
    Комментировать
  • Как сделать так чтобы бот discord писал другому юзеру, когда он нажимает на реакцию?

    Vindicar
    @Vindicar
    RTFM!
    Судя по тегам discord и python, хотите использовать discord.py?
    В таком случае, нужно обрабатывать событие на простановку реакции, добыть id юзера, который её проставил, отправить сообщение этом юзеру по его id.

    Самые азы работы с библиотекой тут.
    Ответ написан
    Комментировать
  • Как заставить дискорд бота отправлять сообщения в случайное время?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала определи, что понимается под случайным временем.
    Например, "одно сообщение через каждые t секунд, где t - равномерно распределённое число от 300 до 3600"
    Или "выбрать случайный момент времени в сутках, дождаться его наступления, отправить реплику"
    Или "пусть бот каждый N секунд бросает кубик, если выпала единица - выводим сообщение".
    Все три способа подразумевают разную реализацию и разные ограничения.

    Я полагаю, делаешь бота на discord.py?
    Тогда копай в сторону:
    1. модуля random, чтобы понят как генерировать случайные числа
    2. раздел документации по discord.py посвящённый длительным процессам.

    Логика примерно такая:
    1. Разберись по примеру выше, как делать простой цикл, чтобы бот писал что-то в консоль.
    2. Используй asyncio.sleep() чтобы задержать выполнение цикла на какое-то время.
    3. Научись генерить случайные числа с помощью модуля random, и сделай задержку случайной.
    4. Научись делать случайный выбор сообщения с помощью random.choice()
    5. Научись отправлять сообщения в канал а не в консоль (метод, который пригодится)

    Подробнее - только кодом.
    Ответ написан
  • Как забрать сразу несколько ролей?

    Vindicar
    @Vindicar
    RTFM!
    Напиши функцию, которая берёт такую строку, превращает её в массив.
    API remove_roles() позволяет указать несколько ролей сразу, просто распакуй массив в список аргументов через *.
    input_str = '123 456 789'
    role_ids = input_str.split()
    reason = 'Потому что гладиолус!' #или None
    target_member.remove_roles(*role_ids, reason=reason)
    Ответ написан
    1 комментарий
  • Проблема с cogs, переделал код и не могу понять в чём проблема?

    Vindicar
    @Vindicar
    RTFM!
    Из документации по purge():
    You must have the manage_messages permission to delete messages even if they are your own (unless you are a user account). The read_message_history permission is also needed to retrieve message history.

    У бота точно есть разрешения на это?

    Далее, purge(limit = 1) - что вообще пытаетесь сделать? Удалить сообщение с командой? purge() вообще-то для массовых удалений по критерию.
    Не лучше ли будет использовать ctx.message.delete()?
    Ответ написан
    1 комментарий
  • Как исправить ошибку discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, фигачить cursor.execute() прямо в f-строку - это очень, очень плохая идея. За такое бьют по пальцам.
    Во-вторых, not subscriptable означает, что ты пытаешься обратиться по индексу (типа x[0]) в то время как объект (x) - это None.
    90% шанс что это вызов .fetchone()[0] - запрос к базе не находит нужную строку, тогда fetchone() возвращает None, а дальше попытка получить индекс от None генерирует исключение.

    Никогда, НИКОГДА не пиши в f-строках выражение сложнее чем 2*2. Вынеси промежуточный результат в переменную, проверь её значение на корректность, затем уже используй.
    Ответ написан
    Комментировать