Ответы пользователя по тегу Discord
  • Если у человека нет определённой роли, как сделать так, чтобы другие определённые роли в таком случае отнимались?

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

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

    Vindicar
    @Vindicar
    RTFM!
    В discord.py ты можешь просто сравнивать роли. Но ты пытаешься сделать это вручную...
    Если заглянуть в исходники либы, то можно увидеть, что там проверяется свойство position. Причем вроде как меньший position означает меньшие привилегии, с поправкой на то что роль @everyone меньше всех.
    Тогда решением твоей задачи будет:
    1. Определить список ролей твоего токена на рассматриваемом сервере.
    2. Определить наибольший position среди этих ролей.
    3. Получить список всех ролей на рассматриваемом сервере.
    4. Отсеять роли, у которых position больше твоего наибольшего.

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

    Vindicar
    @Vindicar
    RTFM!
    так не синхронный schedule используй, а aioschedule.
    Есть пример для телеграм-бота, адаптируй его под discord.py (или клон который ты используешь).

    А последняя часть вопроса намекает на необходимость в Finite State Machine (FSM).
    Ответ написан
    7 комментариев
  • 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 комментария