Ответы пользователя по тегу Discord
  • Проблема с произведением музыки в 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() отдаст нужный объект.
    Ответ написан
    Комментировать
  • Как написать input для дискорд бота?

    Vindicar
    @Vindicar
    RTFM!
    Простой вариант - параметры команды. Иными словами, задаёшь все исходные данные для выполнения команды в одном начальном сообщении.
    Например,
    > Ты: !скажи 3 Привет
    < Бот: Привет
    < Бот: Привет
    < Бот: Привет
    Если ты используешь discord.py, то она предоставляет очень удобный механизм для таких вещей. Он подробно описан в документации.

    Сложный вариант - пошаговый/диалоговый.
    Тогда тебе придётся помнить для каждого юзера, на каком шаге он находится, и обрабатывать входящие сообщения в зависимости от текущего шага.
    По сути, это конечный автомат.
    Ответ написан
    Комментировать
  • Как с помощью discord бота сохранить файлы от пользователя на свой компьютер?

    Vindicar
    @Vindicar
    RTFM!
    discord.py
    Событие on_message для обработки входящих и исходящих сообщений (пример).
    Свойство attachments объекта Message, чтобы проверить прикреплённые файлы.
    Если же сброшенное изображение - это ссылка, то тут нужно регулярками шерстить текст сообщения.
    Ответ написан
    Комментировать
  • Как в discord.py сделать чтобы создатель сервера мог указывать роли для команд?

    Vindicar
    @Vindicar
    RTFM!
    Нужна база данных, так как эту информацию нужно будет сохранять при перезапуске бота.
    Если задача стоит как "укажите, какая роль будет модератором", то тогда в базе должна быть таблица, где сопоставляется ID сервера и ID роли.
    Тогда алгоритм задания роли будет такой:
    1. Проверяем, что отправивший команду является владельцем сервера.
    2. Определяем ID сервера.
    3. Вытаскиваем из параметров команды название роли.
    4. Перебираем роли на сервере, ищем роль с таким названием, запоминаем её ID.
    5. Помещаем пару сервер-роль в таблицу БД. Для обычной базы данных на основе SQL (вроде строенной питоновской sqlite) хорошо использовать запрос вида INSERT ... ON CONFLICT UPDATE ... - это позволит не париться, была ли уже задана роль модератора для этого сервера.

    Алгоритм проверки роли будет такой:
    1. Получаем ID сервера, на котором была отправлена команда.
    2. Получаем ID роли отправителя команды.
    3. Проверяем, есть ли в таблице строка с такой парой сервер-роль.
    4. Если есть, разрешаем выполнить команду.

    В качестве упражнения для обучения это хорошая идея.
    С практической точки зрения - это абсолютно бесполезно, потому что роль с правами модератора может кикать и банить по правому щелчку мыши по юзеру, безо всяких ботов.
    Ответ написан
    Комментировать
  • Как сделать покупку валюты в боте Discord?

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

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

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

    Vindicar
    @Vindicar
    RTFM!
    Наверно, потому что ctx.author.send(), если нужно написать в приват автору. Или ctx.channel.send(), если сообщение пришло с сервера и нужно ответить там же.
    Ответ написан
    1 комментарий
  • Как в discord.py сделать функцию shutdown?

    Vindicar
    @Vindicar
    RTFM!
    Если речь об остановке программы, то гипотетически может пригодиться модуль atexit.
    Но нужно иметь ввиду, что этот модуль не поможет если процесс убит сигналом KILL (Unix системы) или через TerminateProcess() (Windows системы).
    Кроме того, нет гарантий, что после вызова atexit-обработчика бот проживёт достаточно долго, чтобы на самом деле отправить сообщение по сети, а не только "принять к сведению и поставить в очередь".

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

    Vindicar
    @Vindicar
    RTFM!
    1. Гуглить пробовали? Вторая же ссылка по запросу "discord.py embed" ведёт вот на этот пошаговый туториал.

    2. "You Won Free Nitro"? Ну-ну. Зарепортил вопрос.
    Ответ написан
    Комментировать
  • Из-за чего не выполняются действия?

    Vindicar
    @Vindicar
    RTFM!
    > user_id: Value "Amogus" is not snowflake.
    > user = await client.fetchUser(message.username);

    Если не обращать внимание на упоротую терминологию, я подозреваю что fetchUser() требует ID пользователя (для дискорда это длинное число), а не ник.
    Но это просто догадка.
    Ответ написан
    Комментировать
  • Как cделать доступ к команде только для меня?

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

    Vindicar
    @Vindicar
    RTFM!
    А на койхрен ты создаешь embed внутри цикла?
    По-моему, тут проблема не в sqlite и не в дискорде.
    Ответ написан
    Комментировать
  • Как сделать так чтобы бот 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 комментарий
  • Как на отдельные сообщения поставить роли и чтобы при нажатии выдавалось роль?

    Vindicar
    @Vindicar
    RTFM!
    1. Гуглишь "discord.py reaction role github"
    2. Находишь ботов типа Reaction Light.
    3. Разбираешься, как это сделано у них.
    4. ???
    5. PROFIT

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

    Vindicar
    @Vindicar
    RTFM!
    Подсказка - нужно изменить эту строку:
    member = payload.member
    Для on_raw_reaction_add() поле payload.member - это тот, кто поставил реакцию.
    Если почитать доки, то у payload есть несколько полей, и среди них message_id, которое содержит id сообщения, на которое была поставлена реакция.
    После этого нужно получить канал, где было сообщение (если что, в payload есть guild_id и channel_id), и на этом канале вызвать fetch_message(). Получите объект класса Message, у которого уже будет свойство author.
    Ответ написан
    Комментировать
  • Проблема с 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. Вынеси промежуточный результат в переменную, проверь её значение на корректность, затем уже используй.
    Ответ написан
    Комментировать
  • Где тут ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Не хочется ругаться матом, поэтому напишу на питоне
    class MyCog (commands.Cog):
        def __init__(self, bot):
            self.enter_times = {}
        @commands.Cog.listener()
        async def on_voice_state_update(self, member, before, after):
            if before.channel is None and after.channel is not None:
                #событие входа в чат - кладем время входа в словарь
                self.enter_times[member.id] = time.time() #число секунд от начала эпохи Unix
            elif before.channel is not None and after.channel is None:
                #событие выхода из чата - вытаскиваем время входа и удаляем его из словаря
                enter = self.enter_times.pop(member.id, None) 
                if enter is not None: # мало ли, бота перезапустили пока кто-то сидел в войсчате
                    delta = time.time() - enter # число секунд с момента входа
                    print(f'member {member.id}: {delta:.1f} seconds')
    Ответ написан
    Комментировать