Ответы пользователя по тегу Боты
  • Как использовать переменную из другого файла?

    Vindicar
    @Vindicar
    RTFM!
    Простейший способ - передать словарь в конструктор.
    class voice(commands.Cog):
        #при создании кога передаёшь ему клиента и tdict
        def __init__(self, client, t_dict):
            self.client = client
            self.tdict = t_dict
    
        @commands.Cog.listener()
        async def on_voice_state_update(self, member, before, after):
            print(self.tdict)

    Имей ввиду, в случае с ссылочными объектами, т.е. словарями, списками и т.п., изменения объекта внутри кога изменит его глобально. А вот объекты-значения (числа, строки, кортежи) так изменить не получится.
    Ответ написан
  • В чём ошибка бота discord?

    Vindicar
    @Vindicar
    RTFM!
    > 'NoneType' object is not subscriptable
    > .fetchone()[0]
    Запрос не вернул ни одной строки, а ты этого не проверяешь.
    И да:
    1. Создание запроса с помощью .format() - говно, и путь к SQL-инъекции (ну или просто багам). Учись как пользоваться плейсхолдерами.
    2. Вставка вызова метода внутрь шаблона форматирования - говно, так как нечитаемо. Да и возвращённое значение не проверишь, как ты только что убедился.
    Вызови метод сначала, закинь результат в переменную, а потом уже её подставляй.
    Ответ написан
    2 комментария
  • Почему не работает api в моем коде бота дискорд discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Не работает - выводит ошибку в консоль? Или молча не работает?
    Если молча, заверни тело vimeworld() в блок
    try:
        ...
    except Exception as err:
        print(err)

    Также можно расставить отладочные print(), чтобы понять, на каком месте происходит ошибка/подвисает программа.

    Вообще я вижу как минимум ошибку в строке
    r[0]['total'].json
    Судя по JSON, который мне отдаёт указанный URL, это должно выглядеть примерно так:
    json_data = r.json()
    total = json_data['total']
    await ctx.send(total)


    Когда разберёшься с этим, прими к сведению следующее: discord.py - асинхронная однопоточная библиотека. Пока выполняется синхронный код, например, твой обработчик команды, бот не может делать ничего другого. А request - как раз синхронная библиотека! Пока она выполняет запрос, она блокирует работу программы. Поэтому если целевой сайт "задумается", твой бот подвиснет. Мигрируй код на библиотеку типа aiohttp. Она тоже асинхронная, и на время общения с сайтом твой бот сможет заниматься другими делами.

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

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

    Так что я бы сначала посмотрел argparse. Оно заточено на аргументы командной строки, но чат-боты недалеко от неё ушли.
    Ответ написан
    4 комментария
  • Как добавить айдишников в конфиг.py?

    Vindicar
    @Vindicar
    RTFM!
    > operator = "4609....71" and "109....307"
    Извините мой французский, но что это за фигня? Вы применяете логические операторы к строкам, неужели ничего неладного не заподозрили?
    Вам нужна коллекция idшников, и нужно проверять вхождение в эту коллекцию!
    Например, множество (так как я не думаю, что оператор должен входить в список дважды, верно?):
    operators = {"4609....71",  "109....307"}
    for op in operators: #перебираем элементы множества
        await bot.forward_message(op, message.from_user.id, message.message_id)

    Тогда добавить нового оператора будет легко и просто:
    operators.add("1234....890")
    При этом при попытке повторного добавления просто ничего не произойдёт.
    Аналогично можно удалить:
    operators.remove("1234....890")
    При попытке удаления отсутствующего оператора будет выброшено KeyError.
    Ну и если надо проверить, является ли id оператором:
    if "1234...890" in operators:
    Ответ написан
    Комментировать
  • Как изменить язык created_at.strftime?

    Vindicar
    @Vindicar
    RTFM!
    import locale
    locale.setlocale(0, "") #чтобы выбрать текущую локаль операционной системы
    # или 
    locale.setlocale(0, "ru-ru") #если нужна именно русская, даже если ОС не на русском.
    Ответ написан
    Комментировать
  • Куда выгрузить discord бота?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как решить проблему с правами бота в discord py?

    Vindicar
    @Vindicar
    RTFM!
    Чужие сообщения редактировать нельзя. См. тут.
    Raises

    HTTPException – Editing the message failed.

    Forbidden – Tried to suppress a message without permissions or edited a message’s content or embed that isn’t yours.

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

    Vindicar
    @Vindicar
    RTFM!
    Вариант 1, простой: оформи проверку в виде функции вида user_id -> bool (true - заблокирован), вызывай в начале каждого обработчика команды. Если вернёт true, то просто return.
    Вариант 1.5: не знаю, как насчёт телеги, а вот бибилиотека для дискорда позволяет для обработчика команды указать функцию вида "можно ли вызывать этот обработчик?". Может, для библиотеки, которую ты используешь, есть что-то похожее?
    Вариант 2: оформи проверку как декоратор, и декорируй свои обработчики. Чуть короче чем вариант 1, если реакция на забаненного пользователя однотипная (например, игнор), то я бы предпочёл его.
    Ответ написан
  • Можно ли сделать как-нибудь проще достижения в боте?

    Vindicar
    @Vindicar
    RTFM!
    Подумай, что требуется для описания достижения:
    1. Событие, которое вызвает его получение (сообщение, реакция, заход на канал, и т.д.)
    2. Программный код, который получает данные о событии и обновляет состояние достижения (например, увеличивает счётчик сообщений). Он может сообщить, получено ли пользователем какое-то достижение вместе с этим событием.
    3. База, где хранится информация о достижениях того или иного пользователя. В простейшем случае она будет иметь вид "пользователь-показатель-счётчик", т.е. например "вася - сообщения - 254". Код из п.2 будет читать этот показатель, увеличивать его, и если достигнуто желаемое значение, то выдавать сообщение. Для простоты можно хранить сообщения в отдельной таблице вида "показатель-порог-сообщение", тогда если показатель равен тому или иному порогу, бот должен послать соответствующее сообщение.

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

    Vindicar
    @Vindicar
    RTFM!
    Дай угадаю, работает только первый или только второй метод, и если поменять их местами, начинает работать другой?
    Переименуй один из методов balance, ты же всё равно указываешь параметр name в декораторе.
    Ответ написан
    1 комментарий
  • Как сделать так, чтобы команды автоматически добавлялись в help?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, если ты пропишешь docstring у функции, реализующей команду, то этот docstring будет использован в качестве справки. При этом все команды в отдельном Cog-классе уже будут сгруппированы вместе.
    Во-вторых, у декоратора @bot.command() есть параметр help - если я верно понял, он позволяет задать описание команды явно, вместо ииспользования docstring.
    Ответ написан
  • В чём ошибка кода?

    Vindicar
    @Vindicar
    RTFM!
    Прошу прощения, мой предыдущий ответ был неверен.
    Похоже, Дискорд больше не позволяет неофициальным клиентам присоединяться к серверам.
    См. issue #888 на github'е discord.py.
    Ответ написан
  • Как выдать роль новому участнику discord js?

    Vindicar
    @Vindicar
    RTFM!
    Проверка на вменяемость: соответствующие интенты и права у бота есть?

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

    Vindicar
    @Vindicar
    RTFM!
    Именно бота (т.е. программу, работающую с учёткой бота) - нельзя.
    А вот клиент-бота (т.е. программу, работающую из-под учётки клиента) - можно.
    Смотри метод Client.fetch_invite(). Но такие программы идут против ToS Discord, так что если поймают - могут и забанить.
    Ответ написан
    1 комментарий
  • Как сделать чс пользователей, которые не смогут использовать команду discord py?

    Vindicar
    @Vindicar
    RTFM!
    Хранишь в базе или в каком ином хранилище список забанненых и проверяешь ID отправителя на вхождение.
    discord.py позволяет указать фильтр при регистрации команды, чтобы не писать проверку руками в каждой команде.
    Вместо файла/БД можно просто создать роль типа "доступ к боту запрещён" и проверять пользователя на наличие этой роли. Так может быть проще.
    Ответ написан
    Комментировать
  • Ограничение ввода данных в переменную?

    Vindicar
    @Vindicar
    RTFM!
    number1 = message.text.split()[1] #вытащили нужный кусок строки
    try:
      number_value = int(number1) #int() выбросит исключение ValueError, если строка не является записью числа
      if  not (0 < number_value <= 1000):
        raise ValueError() #мы сами выкинем ValueError, если число недопустимое
    except ValueError: 
      await message.answer('введите число от 1 до 1000') #ругаем пользователя
      return #завершаем обработку команды
    #если управление дошло досюда, число number_value допустимое.
    Ответ написан
    Комментировать
  • Как забрать роль в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Документацию читать уже не модно?
    Ответ написан
  • Как считать время (кулдаун) для команды?

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