• Как сделать удаленный доступ к консоли сервера "Minecraft"?

    Vindicar
    @Vindicar
    RTFM!
    Наиболее простой способ - держать и сервер, и бота на одной машине, и запускать процесс сервера как дочерний к процессу бота. Сервер стартуешь с опцией --nogui, тогда он будет читать команды со стандартного входа, а лог консоли писать или на стандартный вывод или на stderr, нужно смотреть куда именно.
    Так как тебе нужно, чтобы дочерний процесс работал параллельно с основным, то вместо обычных функций из модуля subprocess нужно использовать subprocess.Popen.
    После этого периодически вызываешь Popen.communicate(), чтобы подсунуть серверу новую команду на стандартный ввод, и прочитать его лог со стандартного вывода. Например, храни список команд, которые надо отправить, а в цикле проверяй его. Тогда достаточно будет подложить команду в список, чтобы она потом отправилась. Выхлоп сервера можно перенаправлять по мере поступления в какой-нибудь приватный канал дискорда, для мониторинга и отладки.
    Как сделать этот цикл параллельно с работой бота, думай сам - ты не указал библиотеку для дискорда. Если это дискорд.пи, то там есть механизм для периодического вызова функций. Читай документацию.
    Ответ написан
    Комментировать
  • Работа с датами?

    Vindicar
    @Vindicar
    RTFM!
    datetime в помощь.
    Ответ написан
    Комментировать
  • Что еще можно добавить?

    Vindicar
    @Vindicar
    RTFM!
    Мой совет: сделай каждую команду отдельной функцей вида:
    # ': str' - это type hint. На выполнение не влияет, оно в первую очередь для читаемости. Можешь пока пропустить.
    def command_plus(args: str):  # функция получает аргумент как строку, вместо вызова input().
            "Складывает указанные числа."  # doc-string содержит человекочитаемое описание функции
            print("Калькулятор на сложение")
            parts = [int(part) for part in args.split()]  # операции со строками, list comprehensions
            if not parts:  # какие значения в питоне истинные (truey), какие ложные (falsy)?
                    parts.append(int(input("1-е число: ")))
                    parts.append(int(input("2-е число: ")))
            res = sum(parts)
            print(f"Результат: {res}")  # f-строки

    Далее, научись работать со словарями:
    # словарь, содержащий имя команды и её функцию
    commands = {
            'calc +': command_plus,
            # тут будут другие команды
    }

    Тогда рабочий цикл будет примерно таким:
    while True:
            cmd = input('Введите команду: ')  # например, "calc + 2 3 5"
            for cmd_name, cmd_func in commands.items():  # цикл for, операции со словарями
                    if cmd.startswith(cmd_name):  # операции со строками
                            cmd = cmd[len(cmd_name):]  # срезы (slice)
                            try:  # обработка исключений
                                    cmd_func(cmd)
                            except Exception as err:
                                    print(f"Произошла ошибка: {err}")
                            break  # операторы передачи управления
            else:  # Как работает оператор else: совместно с циклами?
                    if cmd == 'exit':
                            print('До свиданья')
                            break # прерываем while
                    else:
                            print(f"Неизвестная команда: {cmd}")

    Будет куда проще читать код и расширять функциональность.
    Ну и почитай по темам, которые я упомянул в комментариях.
    Ответ написан
    Комментировать
  • Как указывать пути к файлу в Kivy?

    Vindicar
    @Vindicar
    RTFM!
    file = open('Файл.txt', 'r', encoding = 'utf-8'), то есть работаю с файлом, который находится в папке с main.py,

    Неправильно. Ты работаешь с файлом, который находится в текущем рабочем каталоге, так как ты указал относительный путь (т.е. не от корня диска).
    Текущий рабочий каталог может совпадать или не совпадать с каталогом, в котором находится скрипт. Это зависит от поведения программы, которая скрипт запускает, будь то проводник винды, командная строка или ещё что. Кроме того, программа может менять свой текущий рабочий каталог при желании.
    Иными словами, ты не контролируешь, какой будет рабочий каталог на момент запуска программы - разве что поменяешь его самостоятельно.
    Так что лучше указывать абсолютный путь. Самый простой способ - получить из sys.argv[0] путь к скрипту и подняться на уровень выше. Вот тогда получишь путь к папке где лежит твой скрипт. И от этого пути уже отталкивайся.
    Операции с путями удобнее всего делать с помощью pathlib, или по старинке с помощью os.path.
    Ответ написан
    Комментировать
  • Как сделать, чтобы бот отвечал на команду только в канале с меткой 18+?

    Vindicar
    @Vindicar
    RTFM!
    Взять и сделать. Как получить канал, на котором была дана команда, знаешь?
    А дальше достаточно глянуть в доку. Метод is_nsfw() в помощь.
    Ответ написан
    Комментировать
  • Как спарсить динамический текст python?

    Vindicar
    @Vindicar
    RTFM!
    Они обновляются скриптом наверняка. А скрипт наверняка делает фоновый запрос к бэкэнду сайта.
    Отсюда:
    а) Выяснить, что это за запрос, и научиться его выполнять самостоятельно с помощью requests. Бонус - наверняка там что-то удобочитаемое, типа JSON, а не HTML.
    б) Использовать полноценный браузер, умеющий выполнять скрипты, типа selenium. Громоздко и медленно, но зато позволяет успешнее косить под обычного пользователя.
    Ответ написан
    Комментировать
  • Как взаимодействовать с mp3 файлами через код? (python)?

    Vindicar
    @Vindicar
    RTFM!
    Ты открыл файл для чтения как последовательность байт и поставил указатель твоего открытого файла в начало.
    Вопрос: как это повлияет на чтение файла дискордом, если он открывает файл самостоятельно?

    Правильно, никак. Просто прекрати воспроизведение и начни его снова.
    Ответ написан
    2 комментария
  • Как удалить данные из таблицы pysqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Когда ты делаешь with self.connection, ты создаёшь транзакцию БД - т.е. связный набор операций, которые будут либо все вместе применены, либо все вместе отвергнуты. Так как у тебя только одна операция каждый раз, это не имеет смысла.
    А вот курсор у тебя используется один и тот же, вне транзакции. Это не дело. Лучше создавай его заново внутри метода.
    Ответ написан
  • Можно ли отследить, по какой инвайт-ссылке пользователь зашел на сервер?

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

    Vindicar
    @Vindicar
    RTFM!
    @bot.message_handler(func=lambda m: True)
    Заменяешь лямбду на свою функцию, которая расшифровывает сообщение, и возвращает True для правильного текста. Что-то типа
    @bot.message_handler(func=lambda m: my_msg_decode(m) == '/help')
    А уж реализацию my_msg_decode() придётся писать самому.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы команда бота дискорд работала только при условии, что человек в голосовом чате (python)?

    Vindicar
    @Vindicar
    RTFM!
    Как всегда, читаем документацию.
    Member.voice может содержать либо None, либо объект VoiceState. А VoiceState, в свою очередь, имеет поле channel.
    Дальше догадаешься?
    Если нет, один подход - проверить поле members у полученного объекта VoiceChannel. Но можно и по-другому.
    Ответ написан
  • Как исправить AttributeError: 'Client' object has no attribute 'command'?

    Vindicar
    @Vindicar
    RTFM!
    На кой огурец тебе И экземпляр Client И экземпляр Bot?
    Ты вообще документацию на discord.py читал?
    class discord.ext.commands.Bot
    Represents a discord bot.
    This class is a subclass of discord.Client and as a result anything that you can do with a discord.Client you can do with this bot.

    Выделение моё. Bot умеет всё, что умеет Client, так что Client имеет смысл использовать ТОЛЬКО если тебе не нужны фичи и поведение именно Bot.

    Ну и фарш в импортах тоже хорош.
    from discord.ext import commands
    from discord.ext.commands import Bot

    А потом всё равно используешь commands.Bot.
    Давай, приводи код в порядок.
    Ответ написан
    Комментировать
  • Как сделать изменение ника в telegram по кнопке?

    Vindicar
    @Vindicar
    RTFM!
    Что мешает засунуть with внутрь ChangeNick()?
    Ответ написан
    Комментировать
  • Как сделать независимый while в python?

    Vindicar
    @Vindicar
    RTFM!
    1. Не надо так делать. Сайту твоя долбёжка запросами не понравится. Как минимум, введи задержку от 10 минут и более.
    2. Ты ознакомился с тем, как вообще работают асинхронные приложения? Судя по терминологии вроде "независимый while", нет. Почитай на эту тему, она не тривиальная, но без понимания основ асинхронщины ты далеко не уедешь.
    3. Зависит от библиотеки, но так или иначе тебе нужна корутина, которая сначала делает запрос к сайту (лучше тоже асинхронно, с помощью aiohttp) и обновляет хранимые в кэше сведения, а потом спит нужный интервал времени (и не с помощью time.sleep()!). Эту корутину надо запустить в рабочем цикле (loop) asyncio, а потом уже запускать остального бота. Тогда боту практически всегда будет доступен этот кэш.
    Ответ написан
    Комментировать
  • Игровая команда не показывает полностью сообщение discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Как всегда, достаточно прочитать документацию.
    А мне лень!

    async def command(ctx, text) - принимает первое слово-параметр команды. Словом в том числе считается "строка в кавычках".
    async def command(ctx, *text) - принимает слова-параметры команды, каждое слово будет отдельным элементом кортежа text.
    async def command(ctxt, *, text) - принимает всю строку с параметрами как есть, в виде одной строки, независимо от пробелов.
    Ответ написан
    Комментировать
  • Как я могу использовать меньше конструкций try-except?

    Vindicar
    @Vindicar
    RTFM!
    Иногда проще отрефакторить такое в список или словарь.
    errors = [
      "//div[contains(text(),'Такой код не найден!')]",
      "//div[contains(text(),'Данный код не может быть использован')]",
      "//div[contains(text(),'Вы не можете использовать код')]",
    ]
    
    for err in errors:
      try:
        close_error = browser.find_element(By.XPATH, err)
        close_error.click()
        break
      except NoSuchElementException:
        pass
    else:
      print("Not a single error was found")
    Ответ написан
    Комментировать
  • Каким должен быть модификатор доступа при инициализации свойства?

    Vindicar
    @Vindicar
    RTFM!
    Не, ну а в чем вопрос-то.
    В первом случае ты вообще обходишь сеттер свойства, присваивая значение напрямую приватному полю. Сеттер не вызывается, так как ты не обращаешься к свойству bat_capacity.
    Во втором случае ты присваиваешь значение свойству, тем самым провоцируя срабатывание сеттера, который и валидирует значение.
    61ee67404277a591391562.png
    Ответ написан
    3 комментария
  • Как реализовать порядок выполнения и зависимость при создании ТГ бота?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужна реализация state machine (автомат состояний).
    Упрощённо, для каждого пользователя, событие от которого мы обрабатываем, нужно хранить, в каком состоянии он находится (например, в твоём случае "начальное" или "была послана команда /send_id"). Тогда при обработке событий проверяешь, находится ли пользователь в нужном состоянии.

    Хранить состояния можно по разному. В простейшем случае, если состояния не обязаны переживать перезапуск бота и не имею дополнительных данных, может хватить словаря вида "ID пользователя - код состояния".
    Ответ написан
    Комментировать