• Как дать доступ к категории с помощью discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Guild.create_role()
    Guild.create_category()
    CategoryChannel.set_permissions()
    Всё есть в документации, всё названо предельно логично, просто открыть доки и найти.
    Ответ написан
    Комментировать
  • Есть ли другие способы хранения данных?

    Vindicar
    @Vindicar
    RTFM!
    Если значение связано с конкретным пользователем, используй простой файл в профиле пользователя.
    Если значение связано с конкретной установкой, и у тебя точно есть права на запись в каталог твоей программы (например, она портативная), используй простой файл в каталоге программы.
    Если планируешь запускать программу только на Windows, можно использовать реестр.

    Формат файла зависит от того, насколько вероятно расширения набора хранимых данных, и какие данные планируешь хранить.
    Одно значение (любое) - обычный файл, либо как текст, либо как бинарные данные.
    Примитивные типы (строки, числа, логика) - cfg файл, модуль configparser.
    То же плюс списки и словари - json файл, модуль json.
    Древовидная иерархия, смесь примитивных типов данных с небольшими порциями бинарных - модуль pickle.

    Опять же, если строго под виндой - реестр прекрасно справляется с бинарными данными и древовидными иерархиями.

    А вот если у тебя иерархия объектов данных не дерево, а граф (особенно если есть отношения многие ко многим) - без БД никуда.

    Так что по описанным тобой условиям - простой файл в каталоге программы подойдёт.
    Ответ написан
    Комментировать
  • Как сделать чтобы сообщение Telegram обновлялось пока выполняется другой скрипт?

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

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

    Vindicar
    @Vindicar
    RTFM!
    Это многопроцессность, а не многопоточность. Разница ОЧЕНЬ значительная, так как у разных процессов разные адресные пространства, и данные между ними приходится пересылать с сериализацией через pickle.

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

    Vindicar
    @Vindicar
    RTFM!
    Грубо говоря, для асинхронной программы верно одно утверждение: "пока ты выполняешь код, не являющийся await вызовом, остальная программа простаивает".
    Каждый await вызов (а также его завершение) - это повод переключиться на другую задачу.
    Таким образом, бесконечный цикл - это просто:
    while True:
      await asyncio.sleep(5) #пока текущая корутина спит, остальной бот работает
      do_stuff() #пока do_stuff() работает, остальной бот спит

    Вопрос в другом: нужен ли бесконечный цикл?
    Я бы посоветовал начать с создания системы сбора статистики.
    Например, завести таблицу вида id юзера - имя статы - значение статы.
    Скажем "id - число_сообщений - 100500". И в обработчиках соответствующих событий делать UPDATE на эту таблицу. А потом в отдельном модуле периодически проверять статы пользователей, проверять, есть ли у них уже ачивка за эту стату, и если нет - то давать.
    Ответ написан
  • Как исправить код?

    Vindicar
    @Vindicar
    RTFM!
    commands = {
            'Привет' in message: say_message("Здравствуйте, сэр!"),
            'как дела' in message: say_message('Всё отлично, у вас?'),
            "всё хорошо" in message: say_message("Это отлично"),

    Если бы выучил азы Питона перед тем как делать ботов по видосикам, знал бы, что так словари не работают. Ты можешь сделать немного по другому, если очень хочется:
    commands = [
    ( (lambda text: 'привет' in text), 'Добрый день!'),
    ( (lambda text: 'пока' in text), 'До свидания!'),
    ]
    #используем так:
    for predicate, response in commands:
      if predicate(message):
        say_message(response)
        break
    else: #else относится к for, сработает если не было break, т.е. не нашли команду
      say_message("Моя твоя не понимает")

    Или можешь попробовать воспользоваться вот этим моим ответом.
    Ответ написан
    2 комментария
  • Конвертировать str to dict?

    Vindicar
    @Vindicar
    RTFM!
    Если используешь requests, то получфаешь данные по HTTP. А значит там не питоновский словарь, там JSON. Они похожи, но не одно и то же!
    Используй модуль json.
    Ответ написан
    Комментировать
  • Вывод всех введённых чисел, кроме 0, но ввод можно продолжить и после 0. Не понимаю: как решить?

    Vindicar
    @Vindicar
    RTFM!
    Вместо input() читай из sys.stdin как из текстового файла?
    import sys
    for line in sys.stdin:
      ... #обрабатываешь введённую строку

    В винде можно в консоли нажать ctrl-z, Enter, это будет сигнал "конец стандартного ввода". Это будет как-бы конец файла, и цикл for прервётся.

    Соответственно, просто делаешь логический флаг "был введён 0" (по умолчанию сброшен), и пока он сброшен - повторяешь введённые числа. Когда он выставлен - не повторяешь. Если пользователь ввёл 0 - выставляешь этот флаг.
    Ответ написан
    Комментировать
  • Как отправить изображение используя socket?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, выучи разницу между TCP (SOCK_STREAM) и UDP (SOCK_DGRAM).
    В последнем случае у тебя НЕ ГАРАНТИРУЕТСЯ ни факт доставки сообщений, ни их правильный порядок, да и на размер сообщения есть ограничения. Также сервер без понятия, когда клиент закончил отправку сообщений.

    Так что лучше разберись, как установить (и корректно закрыть!) TCP соединение и перепиши скрипт на него.
    Ответ написан
  • Можно ли проконтролировать наступление времени?

    Vindicar
    @Vindicar
    RTFM!
    Правильным решением было бы использование планировщика ОС (cron в Linux, планировщих задач в Windows).
    Но если очень надо решение на чистом Питоне, пакет schedule в помощь. Только он требует вечный цикл для работы, так что твой скрипт будет висеть в памяти и жрать проц понемногу. Вот почему советую обойтись средствами ОС.
    Ответ написан
    Комментировать
  • Как экранировать элемент в командной строке (модуль argpars)?

    Vindicar
    @Vindicar
    RTFM!
    Может, проще будет так?
    example.py -genres Romantic -genres Drama

    argparse такое умеет.
    Ответ написан
    Комментировать
  • Можете мне словесно объяснить строку кода python?

    Vindicar
    @Vindicar
    RTFM!
    x = [
        "".join( #6
            [
                "".join( #3
                    [
                        "01"[(i + j) % 2] * k #1
                        for i in range(n) #2
                    ]
                ) + "\n" #4
            ] * k #5
        ) 
        for j in range(n) #7
    ]

    1. Если i + j четное, то генерируем строку из k нулей, иначе из k единиц
    2. Генерируем список из n таких строк, с индексом i
    3. Склеиваем полученные строки без разделителя
    4. В конец приклеиваем перевод строки.
    5. Делаем список из k повторов строки, сгенерированной в ходе 4.
    6. Склеиваем эти повторы без разделителя
    7. Генерируем строки по пп. 1-6 n раз с индексом j и формируем из них список.
    Ответ написан
    Комментировать
  • Как правильно обучить модель нейронной сети?

    Vindicar
    @Vindicar
    RTFM!
    Для начала нужно определиться, случайные у вас числа, или они связаны с другими числами в групе, или они формируют временные серии. И если формируют, то какая должна быть зависимость - индивидуальная в каждой позиции в группе, или для серии в целом.

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

    Vindicar
    @Vindicar
    RTFM!
    ses.proxies = prx
    Множественное число - "proxies"... Может, ему нужен список прокси, и он будет искать первый рабочий?

    EDIT: нет, ему нужен словарь прокси для разных протоколов.
    Ответ написан
    3 комментария
  • Что в коде не так?

    Vindicar
    @Vindicar
    RTFM!
    k = list(input())
    input() вернёт строку.
    конструирование list() на базе строки разобьёт её на одиночные символы.
    Ты что пытаешься сделать? .split()?
    Ответ написан
    1 комментарий
  • Может ли телеграм бот читать exel файл который я ему отправил?

    Vindicar
    @Vindicar
    RTFM!
    Да, можно, если речь идет о Excel (а не exel).
    Зависит от формата файла. Новый .xlsx читается довольно легко, есть библиотеки для этого,но можно и средствами стандартной библиотеки Python - это просто zip-архив с пачкой xml-файлов внутри. Выковырять данные будет не очень трудно.

    А вот старый .xls - это бинарный, плохо документированный формат. С ним будут проблемы.
    Ответ написан
    Комментировать
  • Как написать функцию чистки пользователей, которые заблокировали бота в Телеграм?

    Vindicar
    @Vindicar
    RTFM!
    Перенеси try-except внутрь цикла for, чтобы внутри try-except был только вызов bot.send_message(), и все дела.
    И зачем ты еще раз коннектишься к базе данных внутри except, у тебя ведь уже есть подключение?
    Ответ написан
    Комментировать
  • Во время произношения ассистент говорит "текст"None, как можно исправить?

    Vindicar
    @Vindicar
    RTFM!
    Что за ерунда у тебя в коде творится? Поучи азы Питона сначала, потом уже бросайся помощников писать...

    say_message("Здравствуйте, хозяин!" and "Рад снова вас видеть!")
    Как по твоему, что вот этот and должен значить? На самом деле, у тебя ВСЕГДА будет произноситься только второе выражение. and - это логический оператор в первую очередь. Его поведение для не-логических значений весьма специфическое.

    say_message("Как пожелаете"+str(right_mouse_control()))
    Оставляя за кадром вопрос "зачем", что возвращает функция right_mouse_control()? Она должна возвращать какой-то текст для произношения? Если должна, она явно этого не делает. Если не должна, то зачем ты засовываешь её возвращаемое значение в строку? Почему просто её не вызвать, вне рамок say_message()?
    То же самое для остальных вариантов ниже.

    Ну и простыня elif как вишенка на торте, да.

    EDIT: покажу, как можно это улучшить. Код сложный, но зато легко расширяется.
    Сделаем класс, который будет рулить списком известных команд и сопоставленными им фразами.
    Чтобы не пришлось повторяться, сделаем так, чтобы для добавления новой команды достаточно было
    написать функцию и задекорировать её. Пример будет ниже.
    class VoiceCommandList: #класс управляет списком голосовых команд
      def __init__(self):
        self.actions = list() #список известных классу команд
      
      def on(self, condition): #декоратор, подписывает функцию на голосовую команду
        if isinstance(condition, str):
          condition = condition.lower()
          predicate = lambda text: condition in text #если условие - строка, она должна входить в текст
        elif callable(condition):
          predicate = condition #если условие - функция, она должна вернуть истину для текста
        else: #ни то ни другое - ошибка
          raise TypeError('Condition must be either string or function!')
        #эта функция - декоратор, она будет помечать функции-команды.
        #она описана именно внутри метода on()!
        def decorator(command_func):
          self.actions.append( (predicate, command_func) )
          return command_func
        return decorator
      
      def run_command(self, text): #функция получает строку, определяет и вызывает соотв. её команду
        text = text.lower()
        for predicate, command in self.actions:
          if predicate(text): #текст соответствует известной команде
            try:
              response = command(text) #пытаемся выполнить команду
              if response is None: #если команда не сообщила нам, что ответить
                response = "Команда выполнена" 
            except Exception as err: #не получилось
              response = "Ошибка при выполнении команды"
              print(err)
            if response: #если есть какой-то ответ
              say_message(response) #то произносим его
            break #выполняем не более одной команды за раз
        else: #этот else относится к for, не к if! Если не нашли ни одной похожей команды
          say_message("Неизвестная команда")

    А теперь примеры использования класса. Мы можем добавлять команды, описав функции. Нет нужды править длинную простыню if-elif-else
    vcl = VoiceCommandList() #экземпляр списка команд
    
    #опишем реакцию на простую строку типа "привет".
    @vcl.on('привет') #если передаём в декоратор строку - это означает, что строка должна содержаться в тексте
    def hello(text): #функция-команда принимает аргумент - сказанный пользователем текст
      return "Доброе время суток" #она должна вернуть текст, который скажет бот
    
    @vcl.on('открой оперу')
    def start_opera(text):
      operaopen() #выполняем действие
      return "Браузер запущен" #возвращаем текст ответа
    
    @vcl.on('напиши')
    def write_message(text):
      print(text)
      #если ничего не вернём, будет отклик по умолчанию
    
    @vcl.on(lambda text: ('влево' in text) and ('вправо' in text)) #можно делать сложные условия!
    def what(text):
      return "Так влево или вправо?"

    Ну а чтобы скормить боту распознанную строку:
    vcl.run_command('привет') #сюда можно подставить выхлоп распознавателя речи
    Ответ написан
    8 комментариев
  • Как реализовать запись данных пользователя в телеграм-боте на Python?

    Vindicar
    @Vindicar
    RTFM!
    Если тебе нужно реализовать сценарий, в рамках которого пользователь отправляет несколько сообщений, разбирайся с register_next_step_handler()
    Ответ написан
    Комментировать
  • Где учится созданию ботов на python?

    Vindicar
    @Vindicar
    RTFM!
    Чтобы писать ботов, в большинстве случаев достаточно знать
    1. основы языка
    2. как ставить пакеты через pip
    Также необязательно, но весьма вероятно:
    3. что такое асинхронные программы и как они работают (для ботов, которые выполняют длительные операции)
    4. основы работы с БД (для ботов, которым требуется персистентное хранилище)
    5. что такое конечный автомат и как он работает (для ботов, которые реализуют сценарий из нескоьких шагов)

    А дальше ищешь библиотеки под нужный тебе месенджер, ищешь их документацию, смотришь Quickstart, выбираешь ту, которая выглядит удобнее. Затем постепенно наращиваешь функциональность от своего quickstart-примера - определяешь нужные события/действия, ищешь как на них подписаться или какие методы им соответствуют.
    Ответ написан
    Комментировать