Задать вопрос
  • Как настроить OpenVPN для 1 устройства?

    Vindicar
    @Vindicar
    RTFM!
    Выше верно написали. OpenVPN мог бы решить такую задачу, если нап каждом устройстве был бы свой клиент openvpn.
    А так - убрать redirect-gateway, на роутере прописать статический IP "заворачиваемому" устройству, прописать в up script для openvpn добавление правил роутинга, чтобы все пакеты с "заворачиваемого" устройства роутились через VPN. В down прописать удаление этих правил.
    Если соединение стабильное и не хочется морочиться, правила можно прописать статически.
    Ответ написан
    Комментировать
  • Как сделать чтобы бот ждал какое-то время, но при этом обрабатывал запросы?

    Vindicar
    @Vindicar
    RTFM!
    asyncio.sleep() вполне хватит.
    Бот должен знать своё состояние ("покой", "сбор игроков", "игра идёт", ну и так далее).
    Один обработчик (начало игры) проверяет, что сейчас состояние "покой", отправляет приглашение, ставит состояние "сбор игроков" и ждёт заданное время. По итогам ожидания проверяет список игроков. Если нужного числа игроков в списке нет, ставит состояние "покой", иначе "игра идёт".
    Второй обработчик (игрок присоединился) проверяет, что сейчас состояние "сбор игроков". Если да, добавляет отправителя в список игроков.

    Как хранить состояние, список игроков и другую игровую инфу, зависит от того, может ли параллельно идти несколько игровых сессий. Если не может, то достаточно простых глобальных переменных. Если может... всё сложнее.
    Ответ написан
    1 комментарий
  • Деление строки в список Python?

    Vindicar
    @Vindicar
    RTFM!
    Там список хранит данные о rect из pygame, это отрисовка поля

    Так передавай данные так, чтобы их удобно было парсить. Простейший вариант - используй json.
    Например, сначала генерируешь данные для отправки:
    import json
    # в словаре для отправки могут быть только числа, строки, bool, списки, словари, None.
    # и никаких других объектов. Так что переделываем список rect в список списков.
    # как из rect координаты добыть ищи сам
    rects_to_send = [ [rect.x, rect.y, rect.w, rect.h] for rect in rectangles ]
    data_to_send = {  # в словарь можно также добавить другие данные
      'rects': rects_to_send,
    }
    string_to_send = json.dumps(data_to_send, ensure_ascii=True)+'\n'
    # дальше через сокет эту строку и передаёшь

    Ну и чтение аналогично.
    import json
    
    received_string = ...  # это строка, которую ты получил из сокета
    received_data = json.loads(received_string)
    #received_data будет таким же словарём, как data_to_send выше
    for x, y, w, h in received_data['rects']:
      ...  # рисуешь эти прямоугольники у себя
    Ответ написан
    2 комментария
  • Sign in to confirm you’re not a bot. This helps protect our community. Learn more (Yt-dlp) - как решить?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же английским по-белому написано, что анонимов ютуб не любит. Залогинься и передавай в yt-dlp полученные куки, там для этого есть аж два способа.
    Ответ написан
    6 комментариев
  • Можно ли создать бота который действия из LINUX будет перенаправлять в Telegram сообщением?

    Vindicar
    @Vindicar
    RTFM!
    Вполне можно. Отправить через бот сообщение в телегу, если не требуется приём сообщений от пользователя, можно даже через curl/wget. Вопрос стоит, как собрать в одном файле все требуемые тебе события.
    Можно начать с чего-то вроде этого (код только передаёт общую идею, не гарантирую, что он сходу заведётся)
    #!/bin/bash
    FILE=тут/файл/который/мониторишь
    TOKEN=ТУТ_ТОКЕН_БОТА
    CHATID=ТУТ_НУЖНЫЙ_CHAT_ID
    
    send() {
      # тут реализуешь отправку сообщения, которое лежит в $1
      curl -X POST \
         -H 'Content-Type: application/json' \
         -d '{"chat_id": "$CHATID", "text": "$1", "disable_notification": true}' \
         https://api.telegram.org/bot$TOKEN/sendMessage
    }
    
    while read line; do
      #тут проверяешь строку на соответствие регулярным выражениям, и шлёшь сообщение
      [[ "$line" =~ 'logged in' ]] && send "User logged in"
      [[ "$line" =~ 'logged out' ]] && send "User logged out"
    done <<(tail -f $FILE)
    Ответ написан
    6 комментариев
  • Как грамотно распределять по websocket данные получаемые из одного источника?

    Vindicar
    @Vindicar
    RTFM!
    Хоть убейся, но нужно два компонента.
    Постоянно работающий сервис, который держит коннект к серверу 1 и пишет инфу в твою БД.
    И основной сервис для взаимодействия с клиентами, который умеет отдавать инфу клиенту согласно его запросу (дата, какой тикер отдавать, и так далее).
    Ответ написан
  • Что эффективнее: np.array_equal или (A == B).all()?

    Vindicar
    @Vindicar
    RTFM!
    Модуль timeit в руки и вперёд, измеряй

    >>> timeit.timeit(stmt='(A == B).all()', setup='import numpy; A, B = numpy.zeros((1000,)), numpy.zeros((1000,))', number=10_000_000)
    20.43348090001382
    >>> timeit.timeit(stmt='numpy.array_equal(A, B)', setup='import numpy; A, B = numpy.zeros((1000,)), numpy.zeros((1000,))', number=10_000_000)
    27.85776079981588
    >>>


    Правда, есть у меня уверенность, что A == B создаёт временный массив, так что это менее эффективно по памяти. А вот делает ли так array_equal() - не знаю.

    EDIT: открыл исходники функции...
    return builtins.bool((a1 == a2).all())
    Ну ты понел.
    Ответ написан
    5 комментариев
  • Как переместить курсор в нужную позицию с помощью JavaScript?

    Vindicar
    @Vindicar
    RTFM!
    Нет, курсор двигать нельзя по очевидным причинам. Представь сайт, который принудительно удерживает курсор на себе, не давая передвинуть его на Х.
    Ты можешь схитрить так: навесить на всплывашку cursor: none, запомнить текущие координаты курсора, и смотреть на смещение курсора относительно этих начальных координат. Не самый надёжный способ, но это кое что.
    Ответ написан
    2 комментария
  • У меня ошибка TypeError: 'list' object is not callable Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Всё перепробовал, а прочитать внимательно - не пробовал.
    Почему ты вообще трогаешь message_handlers, это не декоратор, а список установленных обработчиков. Даже по названию можно догадаться - handlers во множественном числе.
    Тебе нужен message_handler.
    Смотри официальные примеры.
    Ответ написан
    Комментировать
  • Почему не получается запустить клиент через run в Pyrogram?

    Vindicar
    @Vindicar
    RTFM!
    В документации pyrogram английским по белому написано (выделение моё):
    Client.run()
    Start the client, idle the main script and finally stop the client.
    When calling this method without any argument it acts as a convenience method that calls start(), idle() and stop() in sequence. It makes running a single client less verbose.

    pyrogram.idle()
    Block the main script execution until a signal is received.

    Отсюда вывод: у тебя дальше self.client.run() управление не пойдёт, даже конструктор Account не завершится, не говоря уж о вызове new_account.start_messaging().

    И к слову о нём: ты сделал этот метод async, а вызываешь его как будто он синхронный. WTF?
    Ответ написан
  • Есть ли альтернатива декораторам из Python в Java?

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

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

    Vindicar
    @Vindicar
    RTFM!
    1.
    "RuntimeError: threads can only be started once"
    Можно ли это как-то обойти понятным для начинающего в python способом?

    Можно перестать хотеть странного и принять как данность, что завершившийся поток - завершился. С ним уже ничего не сделаешь. Это так на уровне ОС, если что. Так что создавай экземпляр Thread тогда, когда надо запустить поток.
    2.
    Может можно как-то по-другому стартовать, без доп функции?

    И как ты это себе представляешь? Tkinter должен знать, какой твой код выполнить при нажатии кнопки. Единственный способ это сделать - передать ему функцию или иной callable object. Да, можно использовать лямбду, но в лямбду много не уместишь, так что лучше функция.
    А когда придёшь к оборачиванию GUI в классы, поймёшь, что передача функции/метода - наиболее простой и практичный подход.
    Ответ написан
    1 комментарий
  • Как сделать exe файл в python?

    Vindicar
    @Vindicar
    RTFM!
    Для начала можешь переименовать питоновский файл в pyw - это означает запуск без окна консоли.
    А далее, разбираешься с pyinstaller, а лучше сразу с его обёрткой auto-yp-to-exe, там есть опция для оконных приложений.
    Файлы данных внутрь exe я бы не вносил, они всё равно будут распакованы во временный каталог при запуске, так что только запуск замедлишь. Но если очень хочется, такая опция тоже есть, читай доки на вышеупомянутое.
    Ответ написан
    Комментировать
  • Пишу .join в боте и выдает await ctx.command.invoke(ctx), что делать?

    Vindicar
    @Vindicar
    RTFM!
    PyNaCl library needed in order to use voice

    Засунь в гугл-переводчик, там простым английским написано, чего программе нехватает.
    Команду для установки тебе выше написали.
    Ответ написан
    Комментировать
  • Как правильно передать все параметры в функцию. aiogram3?

    Vindicar
    @Vindicar
    RTFM!
    Вся проблема в том, что мне нужно вызвать функцию "Tsize_3" в ручную

    В этом и есть проблема, да. Не нужно вызывать обработчики событий вручную. Если тебе нужно повторить одно и то же действие в двух местах - вынеси его в обычную подпрограмму, и уже эту подпрограмму вызывай и в обработчике, и где там тебе ещё нужно.
    А лучше, опиши, что ты вообще пытаешься сделать - из кода это не очень понятно.
    Ответ написан
    Комментировать
  • Как решить проблему с could not convert string to float?

    Vindicar
    @Vindicar
    RTFM!
    А с чего ты взял, что ты обрабатываешь только колонки mpg и weight? astype(float) ты применяешь ко всему датасету.
    Ты бы и сам догадался, если бы не пытался засунуть всю команду в однострочник - у тебя exception бы вылетел как раз на строке с astype().
    Ответ написан
    Комментировать
  • Как убрать ошибку кода в exe?

    Vindicar
    @Vindicar
    RTFM!
    1. почитать внимательно про auto-py-to-exe и осознать, что он базируется на pyinstaller
    2. почитать, как указать pyinstaller модуль, импорта которого он не увидел (hidden import)
    3. найти, где в интерфейсе auto-py-to-exe можно указать дополнительные опции для pyinstaller (подсказка: секция Advanced)
    4. Вписать в нужный параметр имя comtypes (возможно, придётся указать именно comtypes.stream)
    Ответ написан
    8 комментариев
  • Проблема с customtkinter, параметр command у кнопки и цикл for. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ну классика же, lambda завязывается на саму переменную, а не на её текущее значение. Т.е. если ты изменишь i, то все лямбды это увидят.
    i = 10
    f = lambda: print(i)
    i = 20
    f()  # выведет 20

    Нужно сохранить искомое значение в самой лямбде. Самый простой способ - вот такой хак:
    i = 10
    # сохраняем глобальную i как значение по умолчанию параметра i
    f = lambda i=i: print(i)  
    i = 20
    f()  # выведет 10
    f(30)  # выведет 30

    Как видишь последний вызов работает немножко не так, как мы ожидаем - а ожидаем мы ошибку из-за лишнего параметра. Но можно схитрить так:
    i = 10
    # сохраняем глобальную i как значение по умолчанию параметра i
    # Параметр i может быть передан только по имени: i=30
    f = lambda *,i=i: print(i)  
    i = 20
    f()  # выведет 10
    f(i=30)  # выведет 30
    f(30)  # TypeError: <lambda>() takes 0 positional arguments but 1 was given
    Ответ написан
    1 комментарий