Задать вопрос
  • Во время произношения ассистент говорит "текст"None, как можно исправить?

    Vindicar
    @Vindicar
    UMFUCHI, перечитай пункт 1 коммента выше.
    По сути, vcl.run_command() - это аналог твоего do_this_command().


    Ещё добавлю: возможно, стоит либо изменить проверку на вхождение подстроки, либо добавить поддержку регулярных выражений.
    Потому что команда "напиши привет" будет выполнена либо как "напиши" либо как "привет", в зависимости от того в каком порядке объявлены функции.
  • Как сделать чтобы сообщение Telegram обновлялось пока выполняется другой скрипт?

    Vindicar
    @Vindicar
    InternetMaster, asyncio.sleep() это из asyncio, которая является частью стандартной библиотеки.
  • Во время произношения ассистент говорит "текст"None, как можно исправить?

    Vindicar
    @Vindicar
    UMFUCHI, от твоего старого кода потребуются только две вещи.
    1. Работа с распознавателем речи. run_command() принимает сказанную пользователем строку, ты должен её предоставить как параметр при вызове run_command(). По сути, vcl.run_command() - это аналог твоего do_this_command().
    2. Функция say_message() остаётся неизменной.

    Всё, что было в ветках if-elif твоего старого кода распихиваешь по отдельным функциям, как я показал в примере. Одна ветка - одна функция. Условие ветки (точнее, искомый текст) идёт в декоратор функции.
    Например:
    if "привет" in message :
            say_message("Здравствуйте, хозяин!")

    Превращается в:
    @vcl.on('привет')
    def hello(text):
      return "Здравствуйте, хозяин!"
  • Как сделать достижения в асинхронном боте телеграм(aiogram)?

    Vindicar
    @Vindicar
    black_dis, возможно, но тогда эта функция будет непрерывно перелопачивать базу и проверять все возможные ачивки для всех пользователей поочерёдно. В том числе те, которые зависят от стат, меняющихся раз в год. В том числе для пользователей, которые уже сто лет не появлялись.
    Мне кажется, это намного хуже. В принципе, тебе никто не мешает реализовать вышеописанную проверку как асинхронный таск, запускающийся параллельно обработчику события, особенно если запросы к БД тоже будут асинхронными. Она же не будет связана с логикой основного обработчика...
  • Как исправить код?

    Vindicar
    @Vindicar
    UMFUCHI, В варианте, который я привел тут - никуда, он этого не предусматривает. Он вообще ничего не предусматривает кроме текстовых ответов (бот-говорилка).

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

    Vindicar
    @Vindicar
    black_dis, ну пример. Мы хотим давать ачивку, когда пользователь наберёт 100 сообщений на сервере.
    Тогда при реакции на сообщение мы должны изменить соответствующую стату - сделать stat_bump() с указанием id пользователя, статистики, которая нас затронула (в нашем случае я её назвал messages_sent) и насколько мы эту стату увеличиваем (в нашем случае на 1).
    И вот этот момент и является оптимальным для проверки на получение новых ачивок, как раз когда стата изменилась. Мы можем хранить (в stat_checks) для каждой интересующей нас статы ряд проверок, и ачивок которые они дают, и прогнать эти проверки чтобы понять, какие ачивки будут у пользователя.
    Единственное, нужно учесть, какие ачивки уже есть, иначе за каждое сообщение после 100 пользователь будет снова и снова получать ачивку X)
  • Как сделать достижения в асинхронном боте телеграм(aiogram)?

    Vindicar
    @Vindicar
    black_dis, Как вариант, можно оформить проверку на достижение сразу после изменения статы, ответственной за это достижение. Например, таким образом.

    stat_checks = {
      #проверяемая стата
      'messages_sent': [
        #функция или лямбда для проверки ачивки, id ачивки
        ( (lambda v: v > 100), 'achievement_100_messages'),
      ],
      'voicechat_time': [
        #...
      ],
    }


    Тогда у вас будет функция для повышения статы типа
    def stat_bump(user_id, stat_id, delta):
      #выполняем запрос UPDATE/INSERT для статы stat_id
      query(...)
      #узнаем текущее значение статы stat_id
      stat_value = ...
      #узнаем ачивки пользователя
      achievements  = ...
      for predicate, achiev in stat_checks.get(stat_id, []):
        if predicate(stat_value) and (achiev not in achievements):
          #набрал стату на ачивку, но ачивки такой ещё нет!
          give_achievement(achiev, user_id)
  • Как отправить изображение используя socket?

    Vindicar
    @Vindicar
    Zero None, ну UDP - штука такая. В локалке проблем может и не возникнет.
    Кроме того, так как нет постоянного соединения, придётся добавлять к отправляемому фрагменту изображения метаданные: сколько еще пакетов ожидать, какой номер пакета... в общем, половину TCP реализовать придётся. =)
    Именно поэтому я и посоветовал переделать скрипт, а не искать ошибку в коде.
  • Какой подход для фильтрации таблиц лучше?

    Vindicar
    @Vindicar
    denislysenko, я бы написал класс для фильтрации, а потом уже функцию для форматирования.
    class Filter:
      def __init__(self):
        self.year_to = None
        self.year_from = None
        self.genres = set()
        #ну и так далее
      def check(self, obj) -> bool:
        #делаем цепочку условий отсева вида "условие_актуально and условие_не_выполняется"
        #ну или как там у тебя к году фильма обратиться?
        if self.year_to is not None and obj['year'] > self.year_to: 
          return False
        if self.year_from is not None and obj['year'] < self.year_from:
          return False
        #obj['genres'] должен быть коллекцицей жанров, а не строкой вида жанр1|жанр2
        if self.genres and self.genres.isdisjoint(obj['genres']): 
          return False
        #и так далее, столько условий, сколько надо
        #а если дошли до конца, то фильм подошел
        return True

    Использовать класс тоже просто.
    flt = Filter()
    flt.genres = set(['Drama', 'Romance']) #или вытаскиваешь жанры из аргументов командной строки
    flt.year_from = 2010
    #бум, список подходящих под критерии фильмов
    filtered = list(filter(flt.check, movies))
    #если нужно N лучших, то сортируешь по рейтингу
    filtered.sort(key = lambda m: ... )
    filtered = filtered[0:N]

    Осталось вывести в красивом формате.
    Вообще, я бы посоветовал поменять алгоритм парсинга и сделать dataclass для фильма, т.е. хранить в списке не кортежи а объекты. Было бы сильно проще жить.
    from dataclasses import dataclass
    @dataclass
    class Movie:
      #__slots__ позволяет сэкономить память, если набор атрибутов объекта известен заранее и неизменен.
      #полезно для маленьких объектов, которые будут существовать в большом количестве
      __slots__ = ('id', 'name', 'year', 'genres', 'rating')
      id: str #int?
      name: str
      year: int
      genres: set
      rating: float
    #конструктор датакласс сгенерирует сам

    Тогда нужно переписать парсер, чтобы он по каждой строке создавал новый объект Movie, и складывал их в массив. Затем можно будет заполнить рейтинги фильмов (при создании Movie задашь нулевые).
    А потом уже заниматься фильтрацией и прочим.
  • Не пойму почему не чего не возвращает?

    Vindicar
    @Vindicar
    Влад Авраменко, Если len(a) > 1 функция не вернет ничего, так как нет return. Вызов fun(a) в этой ветке игнорирует возвращаемое значение.
    Если len(a) == 0, функци не сделает вообще ничего, и ничего не вернёт.
  • Какой подход для фильтрации таблиц лучше?

    Vindicar
    @Vindicar
    denislysenko, это числа. Просто ты их из строк не конвертировал. Впрочем, в твоей задаче это не требуется, так что сработает и так.
    И да, тебе еще надо разбить жанры по символу |, иначе фильтр по жанрам замучаешься реализовывать.
  • Можно ли сделать бесконечно работающего бота телеграм?

    Vindicar
    @Vindicar
    Kto Takoi, Я написал выше как разбить на строки. А по ссылке практически все базовые операции со строками. Включай голову и пиши код самостоятельно. Можно для начала отдельной программой, пока алгоритм не доведешь до ума.
  • Можно ли сделать бесконечно работающего бота телеграм?

    Vindicar
    @Vindicar
    Kto Takoi, Ну тогда разбей на строки и используй метод .startswith() чтобы проверить каждую.
  • Можно ли сделать бесконечно работающего бота телеграм?

    Vindicar
    @Vindicar
    Kto Takoi, это вообще другая задача >_<
    Дай примеры текста на входе и на выходе, а то у тебя каждый раз иное описание.
    Например, "Данные: " всегда в одном регистре? Они должны быть в начале или в где угодно? Они обязательно присутствуют, или могут отсутствовать?
  • Какой подход для фильтрации таблиц лучше?

    Vindicar
    @Vindicar
    denislysenko,
    1. Да, именно так.
    2. У тебя в элементе data_movies числовой ID фильма под каким индексом? Исправь item[1] на item[0].
    3. Зачем? Ты можешь запросить данные по рейтингу нужного фильма как я показал в лямбде, через averages[id] или averages.get(id, default_value). Так как элементы списка data_movies у тебя - кортежи, их придётся пересоздавать целиком (кортежи не изменяемы). Муторно и долго.
  • Можно ли сделать бесконечно работающего бота телеграм?

    Vindicar
    @Vindicar
    Kto Takoi, lines = text.splitlines() где text содержит исходную текстовую строку. lines будет списком.
    Или я не понял что тебе надо.
  • В чем ошибка получения войс канала дискорд?

    Vindicar
    @Vindicar
    nikto_211, хммм. Попробуй прогони алгоритм, который я выше написал.
    В принципе, вместо вывода id и name можно просто проверить name и сделать connect() если оно совпало с желаемым.
  • Почему вызов функции вызывает ошибку?

    Vindicar
    @Vindicar
    pecenuska2135, читай документацию на Kivy! Какие должны быть параметры у обработчика события ...?

    А твоя функция параметров не имеет. Ты можешь этот параметр не использовать, но объявить его обязан.
  • Как исключить себя из списка экспертов?

    Vindicar
    @Vindicar Автор вопроса
    Но я верно понимаю, что это просто уберёт упоминание?
    Т.е. кому "не повезёт" пригласить меня, останется без эксперта.