Задать вопрос
  • Как заносить ники людей из дискорда (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() будет вызван строго однажды.
    Ответ написан
    Комментировать
  • Есть ли наказание за радужные роли дискорд?

    Vindicar
    @Vindicar
    RTFM!
    Бота может вырубить за флуд, разве что. Да и вырвиглазно это.
    Ответ написан
    Комментировать
  • Не могу решить задачу в питоне с помощью zip?

    Vindicar
    @Vindicar
    RTFM!
    Ну zip() тут ни к селу ни к городу... но в принципе можно использовать.
    1. Введи строку.
    2. Разбей на слова (split() в помощь)
    3. Найди такое наибольшее N, что длина списка слов больше N*N. Т.е. если в списке 6 слов, то N будет 2, так как при N = 3 нам понадобится 9 слов для таблицы. Найти можно просто, извлеки корень из длины списка и отбрось дробную часть.
    4. Построй список списков. Каждый элемент (т.е. каждый вложенный список) будет одним столбцом таблицы, и будет иметь длину N. Т.е. если оригинальный список слов будет words, то мы получим
    columns = [ words[0:N], words[N:2*N], words[2*N:3*N], ... ]
    и так далее. Так как число вложенных списков равно N, т.е. заранее неизвестно, это нужно будет сделать циклом.
    5. Сделай цикл вида for row in zip(*columns):, тогда у тебя zip() возьмёт сначала первый элемент каждого столбца, и скомпонует из них кортеж row. Потом второй из каждого, потом третий, и т.д.
    6. Строки из каждого кортеж row нужно вывести, разделив пробелом. Тут можно метод str.join() использовать.
    Ответ написан
    Комментировать
  • Как наложить одно изображение на другое в телеграмм боте?

    Vindicar
    @Vindicar
    RTFM!
    Подозреваю, что file - это файловый объект, а не файл на диске. Так что file_path не соответствует никакому пути на твоей машине.
    Ответ написан
  • Возможно как-то запускать ffmpeg не через консоль?

    Vindicar
    @Vindicar
    RTFM!
    К сожалению, большинство библиотек для работы с ffmpeg тупо запускают экзешник с параметрами, тем самым наследуя все его косяки. Так что особого выигрыша тут нет.
    Гипотетически ты мог бы попытаться взять libffmpeg-c или аналог, скомпилировать под нужную тебе платформу (DLL для винды, so для линукса) и использовать модуль ctypes для работы с ней. Но это, боюсь, будет ещё сложнее.
    Ответ написан
    2 комментария
  • Почему or в python не работает?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты не понимаешь как работает or.
    И не ты первый. Мне вот реально интересно, откуда вообще берётся идея, что логический (в первую очередь) оператор можно использовать таким образом? Машинный перевод с русского на питон, что ли? "Если айди равен тому ИЛИ этому"?
    И что ты пытался сделать? Проверить, что iduser не равно ни одному из указанных id? Так тогда тебе не or нужен.
    if iduser != АЙДИ1 and iduser != АЙДИ2:
    Если айдишек много, практичнее будет in.
    if iduser not in [АЙДИ1, АЙДИ2]:
    Ответ написан
  • Почему при запуске бота пишет ошибка sqlite3.OperationalError: near "bazaa": syntax error?

    Vindicar
    @Vindicar
    RTFM!
    В коде каша. С одной стороны, вроде знаешь про плейсхолдеры, но не синтаксис SQL:
    cursor.execute('INSERT OR IGNORE bazaa (user_id, user_name, username) VALUES (?, ?, ?)', (user_id, user_name, username))

    А в другом месте кода с точностью до наоборот.
    INSERT INTO USERS (user_id, username, first_name,  last_name) VALUES ({user}, "{username}", "{first_name}", "{last_name}", "{ctime()}");

    Почитай про синтаксис INSERT и ON CONFLICT и никогда не формируй запросы форматированием строк.
    Ответ написан
  • Как проверить неопределенное количество элементов?

    Vindicar
    @Vindicar
    RTFM!
    Если each - это список, то тогда составь множество строк, соответствующих каждому элементу each.
    Ты не написал, что такое self.strs, так что приходится использовать его.
    strs_each = set( sefl.strs[e] for e in each )
    А дальше просто, если длина strs_each больше 1, то есть разные строки.
    Ответ написан
    1 комментарий
  • Сan only concatenate list (not "str") to list?

    Vindicar
    @Vindicar
    RTFM!
    s2 = values+'@'+keys
    values будет списком, keys (почему keys, когда это отдельный ключ?) - строкой, как и '@'. Собственно, тебе ошибка про это и говорит.
    Что ты вообще ожидал получить в s2?
    Ответ написан
    Комментировать
  • Как добавить парсер в дискорд бот?

    Vindicar
    @Vindicar
    RTFM!
    n = print(item['name'])
    В-первых, ничего не выводит куда?
    Во-вторых, print() выводит данные в стандартный вывод, обычно в консоль. В дискорд через неё ничего не послать.
    Во-третьих, print() всегда возвращает None. Так что n всегда будет None, и присваивание не имеет смысла.
    В-четвертых, почему не использовать нормальный обработчик команд из discord.ext.commands.Bot? Он тоже позволяет реагировать на сообщения, в придачу к остальным полезностям именно для бота. Это при условии, что ты хочешь именно реакцию на сообщение и не согласен обойтись обычной командой.
    В-пятых, если ты не уверен, что такое print(), почему ты пытаешься писать ботов?

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

    Vindicar
    @Vindicar
    RTFM!
    Если под Windows, то придётся использовать WinAPI.
    GetConsoleWindow() чтобы получить дескриптор окна консоли.
    SetForegroundWindow() чтобы сделать это окно активным.
    SetWindowPos() вообще для перемещения/изменения размеров окна, но также имеет параметры для задания окна "поверх всех".
    Для вызова функций WinAPI из-под питона смотри модуль ctypes.
    Ответ написан
    Комментировать
  • Что значит check_same_thread? В Python sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    sqlite3 не потоко-безопасна - если ты одновременно обращаешься к базе из нескольких потоков, это может запороть базу.
    Соответственно, по умолчанию библиотека проверяет, что подключение к базе используется тем же потоком, который создал этот подключение - т.е. что оно ограничено рамками одного потока. Если это не так, выбрасывается исключение. Это поведение по умолчанию, чтобы новички потом не плакались "почему у меня иногда база портится?!!"

    Но если ты очень осторожен и не допускаешь одновременных запросов (с помощью синхронизации по мьютексу. например), то можно безопасно использовать одно подключение из нескольких потоков. Тогда можно сказать sqlite "не дергайся насчёт потоков, я знаю что делаю". Вот эту возможность (подавить проверку) и предоставляет параметр check_same_thread = False.
    Ответ написан
    Комментировать
  • Как реализовать программу, с возможностью добавления команд из UI?

    Vindicar
    @Vindicar
    RTFM!
    Хранить список команд в каком-то хранилище, очевидно.
    Формат хранилища - на твоё усмотрение.
    ini файл легко правится пользователем (при необходимости), но ограничен в сложности структуры (секции - значения, два уровня).
    json файл менее человеко-читаем, но поддерживает произвольную вложенность (можно представить дерево объектов).
    БД типа sqlite не человеко читаема от слова "совсем", но позволяет формировать более сложные структуры чем дерево.

    С учётом специфики задачи, я бы посоветовал json.
    Ответ написан
    Комментировать
  • Как удалить русские буквы в текстовом файле?

    Vindicar
    @Vindicar
    RTFM!
    Только русские? А что насчёт иероглифов? Или речь о всех символах, не входящих в ASCII?
    В первом случае:
    import re
    s = "privet брат"
    s1 = re.sub('[а-яё]', '', s, flags=re.I)

    Во-втором случае:
    s1 = s.encode('ascii', errors='ignore').decode('ascii')
    Ответ написан
    2 комментария
  • TypeError: 'NoneType' object is not subscriptable где ошибка?

    Vindicar
    @Vindicar
    RTFM!
    role_id = {}".format(role.id)

    За такое бьют по рукам, так как стоит тебе попытаться подставить так строку - начнутся проблемы. Синтаксис подстановки параметров для кого придумали?

    А по вопросу: с какого перепуга ты взял, что у тебя запрос обязательно вернёт хоть одну строку?
    А если ни одной строки не вернулось, что fetchone() вернёт None. От которого ты потом берешь нулевой индекс.
    Вбей в консоли питона None[0] и сравни ошибку со своей.
    Так что сначала вытащи результаты fetchone() в отдельные переменные, проверь их на None, и только потом делай с ними что нужно.
    Ответ написан
    2 комментария
  • Как разделить слова в сообщении telebot?

    Vindicar
    @Vindicar
    RTFM!
    По идее, можно потребовать вводить строку в виде "Петров Иван Иванович 01.01.2000", а потом резать по пробелам.
    Но это будет провоцировать ошибки пользователей - раз, и это будет спотыкаться на некоторых именах (пусть даже Абдурахман ибн Хоттаб) - два.
    Я бы посоветовал не разбивать имя на куски без необходимости.
    Ответ написан
    4 комментария
  • Программа, конверирующая физ. изображения в цифру?

    Vindicar
    @Vindicar
    RTFM!
    если у кого-то есть уже готовая программа, то буду премного благодарен

    За такое здесь посылают на фриланс с формулировкой "задание, а не вопрос", потому что...
    реализовывать ее с нуля ну совершенно нет желания

    ...нет никакого желания бесплатно делать работу за других.

    Далее, C# подразумевает, что работа со сканером ведётся под виндой, так? Можешь посмотреть в сторону Windows Image Acquisition (WIA), это не лучший способ, но умеренно сложный и универсальный. Могу подсказать классы, на которые стоит обратить внимание:
    • WIA.DeviceManager и WIA.DeviceInfo чтобы перечислить доступные устройства ввода
    • WIA.Device для представления отдельного устройства
    • WIA.Item для представления отдельного компонента устройства, съём изображений производится с него
    • WIA.IProperties и WIA.Property для задания настроек сканирования
    • WIA.CommonDialog для показа диалогового окна "идёт сканирование", метод ShowTransfer()
    • Результат получишь как WIA.ImageFile, смотри в сторону метода get_BinaryData(), чтобы получить содержимое файла изображения в заданном формате. Дальше этот файл либо сбрасываешь на диск, либо пишешь в MemoryStream и загружаешь оттуда в System.Drawing.Bitmap.

    Во всяком случае, я так делал, когда мне потребовалось решить эту задачу.
    Ответ написан
    1 комментарий