Ответы пользователя по тегу Discord
  • Pycord. Выдаёт ошибку при просьбе вывода всех забаненных участников, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Если осилить документацию, станет видно, что bans() возвращает не обычный, а асинхронный итератор. А потому перебирать его надо не через for, а через async for. Тащем-та, в документации по ссылке и пример есть, как это делается.
    Ответ написан
    Комментировать
  • Как записать в переменную упоминание пользователя(в Python)?

    Vindicar
    @Vindicar
    RTFM!
    Упоминание где, блин?

    Если в параметрах команды, то достаточно поставить типом параметра discord.Member.
    Ответ написан
  • Как закинуть пользователя на сервер дискорда?

    Vindicar
    @Vindicar
    RTFM!
    Используй нормальные дискордовские инвайт-ссылки. Другого варианта нет, иначе спамеры бы засовывали свои серверы всем подряд.
    Ответ написан
    Комментировать
  • Nextcord не устанавливается, что делать?

    Vindicar
    @Vindicar
    RTFM!
    error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-buil...

    Оно же говорит что нужно взять и где это взять.
    Ответ написан
  • Как вызвать одну функцию из другой в discord боте?

    Vindicar
    @Vindicar
    RTFM!
    Советую не пытаться удалять гланды через противоположный конец тела. А именно:
    Вместо того, чтобы пытаться вызвать обработчик команды, и биться об стенку, пытаясь имитировать всё необходимое окружение, следует просто вынести непосредственно операцию поиска в ОТДЕЛЬНУЮ функцию.
    Собственно, в твоём случае было бы норм и просто вызвать
    search_results = googlesearch.search(query, num_results=3)
    внутри ask(), и обработать полученные результаты - невелико повторение. Я бы сделал именно так.

    Если прям очень хочется сделать общий код для двух команд, вынеси в отдельную функцию и вывод:
    # Messageable - это что-то, чему можно послать текстовое сообщение. Это может быть канал, пользователь, контекст команды...
    async def search_and_reply(query: str, ctx: discord.abc.Messageable) -> None:
        try:
            search_results = googlesearch.search(query, num_results=3) 
            if search_results:
                await ctx.send("Результаты поиска в Google:")
                for result in search_results:
                    await ctx.send(result)
            else:
                await ctx.send("Ничего не найдено.")
        except Exception as e:
            await ctx.send(f"Произошла ошибка при выполнении поиска: {str(e)}")

    И тогда у тебя будет всё проще: search() будет состоять из одного вызова await search_and_reply(query, ctx), но будет брать на себя регистрацию как обработчика команды, проверку ролей и кулдаунов, и прочую мишуру, которой не место внутри search_and_reply(). Тогда ask() может просто сделать аналогичный вызов await search_and_reply(query, channel) в нужный момент, не беспокоясь о специфике дискорд-обработчика, так как search_and_reply() таковым не является.
    Ответ написан
    Комментировать
  • Как сделать проверку роли у пользователя и выдачи второй роли, если первая роль есть?

    Vindicar
    @Vindicar
    RTFM!
    Программа не работает как именно? Отсутствие реакции? Сообщение об ошибке? Комп встаёт со стола и идёт искать Сару Коннор?
    Далее, ты проверил, on_guild_update() вообще вызывается? Хотя бы временный print() в начало вставь.
    Потому что если почитать документацию, там английским по белому написано:
    This requires Intents.guilds to be enabled.

    Какие интенты ты задаёшь боту?

    Ещё важнее: а причём тут вообще on_guild_update()? Это событие отрабатывает, когда изменяются настройки сервера, а из твоего описания следует, что тебя интересуют роли участников. За это отвечает on_member_update().

    Короче, нужно прояснить происходящее.
    Ответ написан
    Комментировать
  • Бот не отвечает на команды | disnake?

    Vindicar
    @Vindicar
    RTFM!
    RTFM!
    Why does on_message make my commands stop working?
    Overriding the default provided on_message forbids any extra commands from running. To fix this, add a bot.process_commands(message) line at the end of your on_message.


    disnake, ЕМНИП - форк discord.py, так что наверняка это верно и для него.
    Ответ написан
    Комментировать
  • Как правильно получить Bot.fetch_user() в Disnake?

    Vindicar
    @Vindicar
    RTFM!
    Поясню ответ выше: ты вызываешь метод на классе Bot, а не на экземпляре этого класса в переменной bot. Будь внимательнее.
    Ответ написан
    Комментировать
  • Как исправить ошибку взаимодействия окна и дискорд бота?

    Vindicar
    @Vindicar
    RTFM!
    В коде нет работы с потоками, ты даже не импортируешь threading.
    Нужно понимать три вещи:
    1. Рабочий цикл бота займёт весь поток, равно как и рабочий цикл tkinter. Совместить их практически невозможно (технически можно, но это очень нетривиально).
    2. Элементы GUI должны создаваться и использоваться строго в одном и том же потоке.
    3. Нельзя делать await вызовы из одного потока в другой.

    Поэтому я бы посоветовал такое грубое, но простое решение:
    В одном потоке потоке создавай event loop (сам! это важно!) и запускай бота. В другом потоке создавай и запускай GUI.
    Какой поток должен быть главным - скорее всего не принципиально. Попробуй оба варианта.
    Используй пару очередей (queue.Queue) для синхронизации между потоками.

    Одна очередь будет периодически проверяться в потоке GUI с помощью root.after(). Почитай документацию на этот метод, но если коротко - он позволяет запланировать вызов функции в потоке GUI через время. Эта очередь будет содержать сведения о том, что нужно обновить в GUI.
    Формат и смысл сведений определи сам. Это может быть что-то высокоуровневое в духе "есть сообщение от пользователя такого-то с таким-то текстом", и пусть поток gui сам разбирается, что с этим делать. Это может быть и что-то более низкоуровневое, типа "задай такому-то свойству у такого-то элемента управления такое-то значение". Я бы посоветовал первый вариант - он позволит разделить логику программы чётко на две части.
    Код проверки будет примерно вида
    def check_gui_queue():
        try:
            while True:
                command = gui_queue.get_nowait()  # проверяем, есть ли команда для GUI
                gui_queue.task_done()  # на каждый успешный вызов get() - один вызов task_done()
                pass  # как-то обрабатываем команду
        except queue.Empty:  # команды нет
            root.after(100, check_gui_queue)  # даём GUI поработать спокойно 100 мс

    Разумеется, если ты завернёшь GUI в класс (что имеет смысл) код немного изменится. Но суть останется прежней.

    Другая очередь будет содержать команды для бота. Периодически проверяй её в потоке asyncio с помощью простого кода вида
    async def check_bot_queue():
        while True:
            try:
                command = bot_queue.get_nowait()  # проверяем, есть ли новая команда для бота
            except queue.Empty:
                await asyncio.sleep(0.1)  # нет - даём другим корутинам поработать 100 мс
            else:
                bot_queue.task_done()  # на каждый успешный вызов get() - один вызов task_done()
                pass  # есть - как-то её обрабатываем

    Эту корутину запустишь через create_task(), и она позволит коду GUI организовывать вызовы в коде бота.

    Разумеется, придётся подумать, как аккуратно сделать, чтобы эти две функции не разрослись в дикую простыню из if-elif-else. Но общий принцип примерно такой.
    Время ожидания команды можно увеличить - это замедлит время реакции пре передаче данных между потоками, но уменьшит холостую нагрузку на систему.
    Ответ написан
    Комментировать
  • Как получить нажатую реакцию из ЛС бота discord pycord?

    Vindicar
    @Vindicar
    RTFM!
    В документацию к используемой библиотеке? По идее реакции в ЛС обрабатываются точно так же, как реакции на сервере, разницы быть не должно.
    Если ты используешь discord.py, то можешь
    а) попытаться использовать wait_for()
    б) хранить где-то соотношение "id пользователя - id сообщения", и обрабатывать on_reaction_add(). А в обработчике уже смотреть, если данному сообщению сопоставлен ждущий роли пользователь - дать роль.
    Ответ написан
  • Как сделать Embed?

    Vindicar
    @Vindicar
    RTFM!
    Окей, гугл, disnake Embed.
    Получаешь ссылку с подробным туториалом, читаешь, осознаёшь.
    А ещё - учишься сначала гуглить, а только потом задавать вопросы.
    Ответ написан
  • Почему выводится ошибка и как ее исправить Sqlite3 Disnake?

    Vindicar
    @Vindicar
    RTFM!
    Запомни простую вещь: никогда, никогда не формируй SQL-запросы форматированием строк. Ни f-строками, ни методом format(), ни %-форматированием. Ты сейчас на своей шкуре почувствовал, почему этого не стоит делать.
    И читай документаци, там написано как правильно. Более того, есть отдельный раздел как раз об этом. RTFM!
    Ответ написан
    Комментировать
  • Возможно ли заставить дискорд бота отправлять рандомное видео с сайта?

    Vindicar
    @Vindicar
    RTFM!
    Вариант А: Если на сайте есть функция "рандомное видео", научиться делать запрос к ней.
    Вариант Б: Стырить Соскрапить с сайта список всех интересующих видео, выбрать рандомное из этого списка. Список можно обновлять время от времени.
    Ответ написан
    Комментировать
  • Почему не работает meber_join disnake?

    Vindicar
    @Vindicar
    RTFM!
    Разберись уже, как работает utils.get().
    Она принимает коллекцию объектов, и набор атрибутов в виде kwargs.
    Возвращает первый объект в этой коллекции, у которого атрибуты совпадают с заданными.
    Т.е. тебе надо туда передать список ролей сервера и атрибут id.
    Ну или использовать другой метод, например, member.guild.get_role().

    Читай документацию, короче.
    Ответ написан
    Комментировать
  • Python discord как удалить сообщение?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как выводить людей списком в 1 сообщение?

    Vindicar
    @Vindicar
    RTFM!
    str.join()

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

    Vindicar
    @Vindicar
    RTFM!
    У бота нет прав выдавать роли на этом сервере.
    Ответ написан
  • Как отправлять одно сообщение а не несколько?

    Vindicar
    @Vindicar
    RTFM!
    Голову включить, для начала.
    Как по-твоему, какой вызов выполняет отправку сообщения? Правильно, interaction.send().
    Этот вызов у тебя в цикле for member in guild.humans, поэтому для каждого участника сервера будет вызвано interaction.send(), а значит, отправлено отдельное сообщение.
    Значит, если хочешь отправлять сведения однажды - вынеси вызов из цикла.
    А чтобы не потерять данные, которые ты в цикле собираешь - помещай их в список.
    После цикла собери этот список в строку через join(), и отправь эту строку одним вызовом send().
    Ответ написан
    3 комментария
  • Из трёх похожих друг на друга команд, создалась только одна, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Отступы! У тебя всё, что после mathsminus() определено ВНУТРИ mathsminus(). Проверь отступы в начале строк.
    Ответ написан
    1 комментарий
  • Как заставить дискорд бота запустить песню?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе бот пишет прямым текстом где он ищет библиотеку:
    OSError: dlopen(opus, 0x0006): tried: 'opus' (no such file), '/usr/local/lib/opus' (no such file), '/usr/lib/opus' (no such file), '/Users/similization/Programming/python/discord_bot/opus' (no such file)

    Найди, куда именно установился опус, и создай символическую ссылку на библиотеку по одному из указанных путей. Лучше всего по последнему, я полагаю.
    Ответ написан