• Нужна помощь с sqlite3, discord.py?

    Vindicar
    @Vindicar
    RTFM!
    В коде неправильного больше чем правильного...
    1. У тебя написано, что команда должна получить два параметра - text и id. Если id она должна найти сама, то его нужно убрать из параметров купить(). id нужно получить из ctx.author.id.
    2. Ты вообще пробовал обращаться к своей базе? Смотрел, что тебе возвращает fetchone()?
    По твоему запросу она вернёт либо кортеж с одним значением, либо None, если не было найдено ни одной подходящей строки.
    Ни то ни другое сравнивать непосредственно нельзя!
    Вытащи результат в переменные, проверь на None, а потом уже сравнивай нулевые элементы.
    3. Убери токен бота из тела вопроса.
    4. Советую cursor создавать внутри обработчика, во избежание заморочек с одновременным использованием.
    5. Советую указывать типы параметров в описании команды! discord.py обращает на них внимание, и пытается конвертировать входную строку.
    async def купить(ctx, text: str):
    6. Как уже было написано, execute() принимает вторым параметром КОРТЕЖ, пусть даже из одного элемента. А кортеж из одного элемента пишется как (item,).
    Ответ написан
  • Как заменить определенную строку на другую в файле формата .docx?

    Vindicar
    @Vindicar
    RTFM!
    В незнании питона, разумеется.
    В Питоне переменная - это не более чем ссылка на объект. Соответственно, если ты присвоил переменной ссылку на другой объект - от этого первый объект не изменится.
    for para in paras: # имя para указывает на объект - элемент списка doc.paragraphs
            para = para.text.split(' ') # имя para указывает на список строк, старая ссылка потеряна.
            for word in para: # имя word указывает на элемент из списка - строку
                //'NAME,' - строка в исходном файле
                if word == 'NAME,':
                    word = name + ',' # имя word теперь указывает на другую строку. Список от этого не изменился.
            para = ' '.join(para) # имя para теперь указывает на строку, ссылка на список потеряна
            # а список doc.paragraphs от присваивания выше тоже никак не изменится,
            # так как он ничего не знает об операциях с para.text

    Попробуй присвоить что-нибудь para.text, для начала. И не переиспользуй имена переменных, тебя что, платить заставляют за каждое имя?
    Ну и не приведён код, который сохранит изменённый документ в файл.
    Ответ написан
  • Как выполнить псевдокод?

    Vindicar
    @Vindicar
    RTFM!
    Используй паттерн Компоновщик (Composite) + Интерпретатор (Interpreter) из набора паттернов Gang of Four.
    Описываешь базовый интерфейс для среды выполнения и для команды:
    //окружение хранит текущее состояние программы плюс предоставляет средства взаимодействия с "окружающим миром".
    public interface IProgramEnvironment
    {
        Dictionary<str, int> Variables {get;} //хранилище переменных
        IProgramOperator CurrentOperator {get; set;} //текущая команда - нужно для переходов
        //ну и что там ещё тебе может потребоваться? Операции ввода-вывода, и т.п.
    }
    //просто составной оператор
    public interface ICompoundOperator: IList<IProgramOperator>
    {
        void ExecuteAll(IProgramEnvironment env); //выполнить дочерние команды
        string ToString(); //для отладки
    }
    //абстрактный оператор, его будут реализовывать классы операторов
    public interface IProgramOperator
    {
        int LineNumber; //номер строки, для удобства обозначения
        IReadOnlyList<ICompoundOperator> ChildrenBlocks {get;} //списки дочерних команд, если они есть
        void Execute(IProgramEnvironment env);  //выполняем команду в окружении. Может потребоваться возвращать значение
        string ToString(); //для отладки
        void Render(); //для отображения на экране?
    }

    Затем описываешь отдельные команды как отдельные классы, реализующие IProgramOperator.
    Если оператор составной, то у него ChildrenBlocks будет не пустым, а будет содержать списки вложенных команды. Например, у цикла будет 2 таких списка (условие и тело), а у ветвления - 3 (условие, если, иначе).
    Тогда при выполнении оператор выполняет свой метод Execute(), и если надо, выполняет те или иные дочерние операторы.
    Соответственно у тебя получится дерево объектов-команд. Корнем дерева будет ICompoundOperator - тело программы. В рамках исполнения программы ты, по сути, обходишь это дерево в глубину.

    Будут некоторые проблемы с реализацией пошагового выполнения, но это можно решить, если превратить метод Execute() в генератор, который будет приостанавливать своё выполнение после каждой команды. Заодно решится вопрос "последнего вычисленного значения" - можно будет просто yield'ить результаты вычислений.
    IEnumerable<object> Execute(IProgramEnvironment env)
    Ответ написан
    Комментировать
  • Почему не работает Schedule python?

    Vindicar
    @Vindicar
    RTFM!
    schedule.every(4).hours.do(First_script())
    Вызвать подпрограмму First_script() НЕМЕДЛЕННО, её возвращаемое значение интерпретировать как адрес функции, вызываемой каждые 4 часа.

    schedule.every(4).hours.do(First_script)
    Взять адрес подпрограммы First_script() и запланировать её вызов каждые 4 часа.
    Ответ написан
    Комментировать
  • Почему не работает выдача роли?

    Vindicar
    @Vindicar
    RTFM!
    1.
    f"SELECT verify_role FROM role WHERE id = {ctx.author.guild.id}"

    Не делай так! Используй подстановку параметров.
    2. fetchone() в твоём запросе вернёт либо None, либо кортеж с одним элементом (id роли). utils.get() не понимает такие кортежи, ей нужен сам id (нулевой элемент кортежа). Иными словами, id это не то же самое, что (id,)!
    Не экономь на переводах строки, помести выхлоп fetchone() в переменную и проверь, что тебе вернуло.
    Ответ написан
  • Как исправить ошибку с одновременными запросами в aiogram?

    Vindicar
    @Vindicar
    RTFM!
    1. Первый пользователь посылает сообщение. Запускается копия search_vk() и выполняет синхронный запрос:
    user_data = vk_parser.get_user_data(user_id)
    Пока запрос выполняется, бот стоит, так как код синхронный.
    2. get_user_data() деляет глупости вида
    with open("FIO.txt", "w") as file: #открываем один и тот же файл для любого запроса

    или
    global bio # используем одну и ту же переменную для любого запроса

    Ну и прочие медиа-файлы тоже одни и те же для разных запросов.
    3. Обработчик сообщения первого пользователя доходит до строки
    loading = await message.answer('<b>Идёт поиск</b>')

    Так как это await-вызов, планируется вызов корутины, и асинхронная программа переходит к следующей доступной операции, пока выполняется отправка сообщения. Собранные данные лежат в файлах.
    4. Второй пользователь посылает сообщение. Запускается ещё одна копия search_vk() и тоже выполняет синхронный запрос get_user_data(). Второй вызов get_user_data() перезаписывает данные в файлах.
    5. Обработчик сообщения второго пользователя доходит до строки
    loading = await message.answer('<b>Идёт поиск</b>')

    и засыпает, пока сообщение отправляется.
    6. Тем временем сообщение первого пользователя отправилось. Обработчик получает управление, и отправляет содержимое файлов - которое было перезаписано, заодно закрывая их.
    7. Сообщение второго пользователя отправилось. Его копия search_vk() пытается отправить файлы, но первый обработчик их уже закрыл.
    Дело ещё осложняется сетевым лагом, так что трудно сказать, кто в итоге будет первым.

    Если по прочтению ты ещё не понял, в чём дело, скажу прямо: не используй глобальные объекты, будь то файлы или переменные, в конкурентной среде! Убедись, что каждая копия обработчика запроса имеет свои хранилища для данных! Локальные переменные безопасны, они создаются каждый раз заново. Если не можешь обойтись без файлов на диске, либо используй модуль tempfile, либо привяжи их имена к ID отправителя сообщения, чтобы хотя бы разные пользователи не сталкивались лбами.
    Ответ написан
    Комментировать
  • IndexError: list index out of range.Как решить?

    Vindicar
    @Vindicar
    RTFM!
    В файле есть строка, в которой нет символа ":". Например, пустая строка (возможно в конце файла).
    Ответ написан
  • Как вписать в дискорд бота команду по выдаче роли с удалением предыдущих ролей?

    Vindicar
    @Vindicar
    RTFM!
    Храни в БД сведения о наказанных пользователях + timestamp окончания срока наказания, и в отдельной таблице - о ролях, которые у них были забраны.
    Ответ написан
    Комментировать
  • Не могу понять суть ошибки: TypeError: on_startup() missing 1 required positional argument: 'message'?

    Vindicar
    @Vindicar
    RTFM!
    on_startup(_)
    Ты говоришь, что функция on_startup() ожидает 1 параметр (по имени _).
    Очевидно, она вызывается без параметров.
    Или в какой момент возникает ошибка? Есть ли декораторы на этой функции?
    Ответ написан
  • Анимация из картинок в tkinter и асинхромная работа с discord, возможно ли это и как это сделать?

    Vindicar
    @Vindicar
    RTFM!
    Главная проблема: у любого GUI-приложения есть бесконечный цикл обработки оконных сообщений. У любого асинхронного приложения есть бесконечный цикл-реактор, который обрабатывает реакции на завершение асинхронных операций (в т.ч. ввода-вывода). Это два разных цикла, они друг о друге не знают, и в одном потоке может работать только один из них.

    Отсюда два решения.
    1. Плюнуть на Tkinter и использовать PyQT. Есть сторонняя библиотека pyqt-async, которая вроде как позволяет засунуть обработку оконных сообщений в цикл-реактор.
    2. Запустить в главном потоке цикл-реактор, а GUI (на базе любого фреймворка) создать и запустить во вспомогательном. Любые задачи для выполнения в главном потоке делать через asyncio.run_coroutine_threadsafe(). Любые модификации GUI делать, создавая статичный объект-описание операции над GUI и поместив его в очередь (Queue, например). Поток GUI должен периодически читать эту очередь, и вносить найденные там изменения. В ткинтере может помочь метод after(), наверно есть аналоги и в других фреймворках.
    Ответ написан
    Комментировать
  • Как создать окно/полноценное приложение на чистом Python?

    Vindicar
    @Vindicar
    RTFM!
    Если на чистом питоне без tkinter, то кроссплатформенного решения нет.
    Под винду - ctypes + windows api, но это очень, очень мучительное решение.
    Под никсы... вот честно, я фз. Не удивлюсь, если там нужно привязываться к конкретному оконному менеджеру...
    Ответ написан
  • В чем ошибка при использовании replace()?

    Vindicar
    @Vindicar
    RTFM!
    У объекта "открытый файл" действительно нет метода replace(). Этот метод есть только у строк.
    И ты открываешь файл для записи, тем самым опустошая его содержимое.
    И вызов close() не нужен, так как по выходу из with файл закроется автоматически.

    Тебе сначала надо открыть файл для чтения, прочитать содержимое файла в строку и закрыть файл.
    Потом произвести замену. И учти, что replace() вернёт тебе новую строку, а не изменит исходную.
    Потом открыть файл для записи, записать в него новую строку и закрыть файл.
    Ответ написан
    1 комментарий
  • Как отследить личные сообщения боту discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Чем не устроил on_message? Да, с ним есть сложности, но название намекает же.
    Ответ написан
  • Как создавать роль и канал по команде?

    Vindicar
    @Vindicar
    RTFM!
    Документацию читал?
    А почему не читал?
    Guild.create_text_channel()
    Guild.create_voice_channel()
    Guild.create_role()
    Ответ написан
    Комментировать
  • Ошибка при сложении матриц?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в matrix_1 будут строки, а не числа.
    Ответ написан
    1 комментарий
  • Как заносить ники людей из дискорда (discord.py) в базу данных sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, сама идея - плохая, так как ник можно менять. Используй числовой id пользователя вместо ника.
    Во-вторых, никогда не формируй текст запроса через форматирование строк. Используй подстановку параметров.
    Ответ написан
    Комментировать
  • Нужна с помощь с discord.py?

    Vindicar
    @Vindicar
    RTFM!
    f"SELECT id FROM userifo where id={member.id}
    Никогда так не делай.
    А вообще, что ты пытаешься сделать? Перебрать все сервера и занести их участников в БД?
    Во-первых, у класса Client (и у его наследника discord.ext.commands.Bot) есть свойство guilds. Это список отдельных серверов, можешь просто перебрать его for'ом.
    Во-вторых, в sqlite есть синтаксис INSERT ON CONFLICT UPDATE, который позволяет добавить запись или обновить её, если она уже существует, за один запрос а не за два.
    В-третьих, твой алгоритм перебора не сумеет обнаружить участников, покинувших сервер, так как они просто не появятся в списке участников.
    В-четвёртых, если ты не понимаешь, зачем в коде та или иная строка, тебе рано браться за написание ботов. Поучи сначала основы питона, почитай документацию на discord.py, потом вернёшься к теме. Сэкономишь много времени на вопросах.
    Ответ написан
    Комментировать
  • Как правильно вынести функции с декораторами в отдельные файлы и потом загрузить в основной?

    Vindicar
    @Vindicar
    RTFM!
    Завернуть во внешнюю функцию и передать нужные объекты как параметры.
    def setup(handler, bot, app):
        @handler.on_message()
        def do_stuff(event):
            pass
    
        @app.route('/stuff')
        def route_stuff():
            return "stuff"

    Тогда в основном коде делаешь просто
    import my_module
    my_module.setup(handler, bot, app)

    Только нужно гарантировать, что setup() будет вызван строго однажды.
    Ответ написан
    Комментировать