Задать вопрос
  • Discord.py Хочу сделать команду autoclear и присвоить ее каналу, но не пойму как это реализовать?

    shurshur
    @shurshur
    y0uSh4, уже лучше и даже наверное как-то будет работать. Но есть замечания.

    Не надо в on_ready делать бесконечный цикл. Лучше сделать отдельный таск, в котором в начале сделать bot.wait_until_ready() (это замена запуска из on_ready), и запустить его до запуска бота. А ещё удобнее использовать discord.ext.tasks безо всяких циклов - discord.py сам будет вызывать функцию с указанным интервалом:

    from discord.ext import tasks
    
    @tasks.loop(seconds=5)
    async def timer_task():
        await bot.wait_until_ready()
        ...
    
    timer_task.start()
    bot.run(TOKEN)


    Код станет гораздо компактнее и нагляднее.

    Но даже так, флудить в API дискорда каждые 5 секунд запросами purge может быть не очень разумно. Правильнее идти "от события": удалять сообщения по мере их появления (они ещё и исчезать будут быстрее, не через 5 секунд), и только при старте бота делать purge (удалять то, что бот не словил в момент его оффлайна), примерно так:

    @bot.event
    async def on_message(message):
        await bot.process_commands(message) # чтобы команды работали
        if message.channel.id == 972431181624791060:
            await message.delete()
    
    @bot.event
    async def on_ready():
        channel = bot.get_channel(972431181624791060)
        await channel.purge(limit=0)


    Всё это, конечно, ещё далеко от "команды autoclear", для которой надо будет при вызове на нужном канале проверять, что её использовал пользователь с админскими правами (есть декоратор для команд) и затем добавлять в какой-то список каналов (сохраняемый куда-нибудь в базу или на диск). Вместо проверки одного канала, соответственно, проверять наличие channel.id в списке наших id. И для вызовов purge не забывать сначала проверять, что get_channel вернул не None. Потому что если хоть на одном из серверов, где есть бот, удалят хотя бы один из этих каналов, то бот сломается и остальные каналы не почистит.

    И да, конечно, нужно будет предусмотреть команду "выключения autoclear".

    В целом мне непонятно, зачем это нужно. Проще просто закрыть возможность писать пользователям в соответствующие каналы, и даже бот не потребуется. Разве что как учебно-тренировочная задача...
  • Discord.py Хочу сделать команду autoclear и присвоить ее каналу, но не пойму как это реализовать?

    shurshur
    @shurshur
    y0uSh4, если у тебя уже 500 строк кода, то ты бы уже должен был запомнить, что on_message - это не обработчик команд, а обработчик сообщений. Судя по при приведённому фрагменту, ты ничего внятного не написал и ничего у тебя не работает. Потому что у тебя сейчас мешанина случайно взятых слов из словаря.

    Я приведу просто пример. У меня тут лежит вордлист на 1488218 слов (не помню, где брал). Я взял из него 8 случайных слов и получилось следующее:

    нежелательной гемотрансфузию прикипание водокачкам тонкошёрстому транссибирской выгребем окошечек


    Что-нибудь понятно? Есть какой-то глубокий смысл в этом предложении? Вот ты примерно так же пишешь скрипты.
  • Что делать выдает ошибку в TeleBot при регистрации шага?

    shurshur
    @shurshur
    TemaGerb27, подсказка: bot.register_next_step_handler позволяет передавать в следующий обработчик дополнительные параметры. Пример есть в официальной доке.
  • Что делать выдает ошибку в TeleBot при регистрации шага?

    shurshur
    @shurshur
    Давай подскажу. Пусть Вася и Петя почти одновременно нажали ball. Затем один ввёл 100 рублей, а другой через секунду ввёл 500 рублей. Что будет в глобальной переменной symma?

    Кстати, не symma, а summa (слово латинского происхождения).
  • Собрать библиотеку буста для питона, как правильно?

    shurshur
    @shurshur
    Скорее всего, python находится по дефолтному имени python, а надо его уговорить на вызов интерпретатора по имени python3. Я бы посоветовал ./b2 --help почитать, возможно там есть что-то на эту тему.
  • Куда переехать с Google IMAP/CalDav/CardDav/LDAP со своими доменами?

    shurshur
    @shurshur
    Александр Фалалеев, по сравнению со SquirrelMail - это прям web 6.0! Что сейчас модно для веб-почты использовать я не интересовался, я со SquirrelMail так и поленился слезать на личной почте, которую я читаю раз в месяц.
  • Недостатки и альтернативы PyQt?

    shurshur
    @shurshur
    mkone112, конечно, типичная веб-архитектура, с бэкджеком и фронтлюхами.
  • Роли в боте вк sql?

    shurshur
    @shurshur
    Артём Смирнов, потому что это в принципе неправильно, не так это делается. Не нужно программировать в режиме "а давай-ка я это тут вставлю", из этого ничего хорошего не получится.

    Первая ошибка - использовать колонку с именем adm не для признака администратора, а для названия класса пользователя. Это же уже прям с самого начала не признак администратора.

    Вторая ошибка - в качестве класса использовать его текстовое название.

    Третья ошибка - текстовые названия потом не получается как-то нормально сравнивать.

    Правильно было бы завести в базе поле типа integer с названием вроде user_class (а может и user_level, или как-то ещё), которое бы принимало числовое значение. В коде завести эти классы и массив отображения их числовых значений в названия. Примерно так (я не призываю прям повторять, просто демонстрация идеи):

    UC_GUEST = 0
    UC_USER = 1
    UC_FLOODER = 2
    UC_CHUDO_UDO = 3
    UC_DONAT = 4
    UC_MODERATOR = 10
    UC_ADMIN = 11
    UC_GOD = 20
    
    user_class_names = {
        UC_GUEST: "Гость",
        UC_USER: "Пользователь",
        UC_FLOODER: "Очень Активный",
        UC_CHUDO_UDO: "Монстр Активности",
        UC_DONAT: "Хорошо помог :)",
        UC_MODERATOR: "Модератор",
        UC_ADMIN: "Администратор",
        UC_GOD: "Самый главный",
    }


    Префиксы UC_ будут признаками того, что это user class. При этом, хотя в python нет констант, существует соглашение, что набранные КАПСОМ переменные представляют из себя неизменяемые значения. Я оставил дырки в последовательности классов, что позволит в случае чего добавлять некоторые классы без перенумерации всей базы. Ну, скажем, потребуется ввести суперадмина - вон там для него есть пространство.

    При выполнении тех или иных действий можно проверять класс пользователя. Например, пользователь может выдать предупреждение, если его класс не ниже модератора:

    if user_class >= UC_MODERATOR:

    Но заодно хорошо бы, чтобы модератор не мог предупредить админа и вообще любого пользователя равного себе уровнем или выше:

    if user_class >= UC_MODERATOR:
        if user_class > get_user_class(member_id):
            # выдаём предупреждение
        else:
            # этот модератор не может выдать этому пользователю предупреждение


    Можно ещё больше усложнять логику. Например, пусть пользователям уровня UC_DONAT предупреждения могут выдавать только админы, обычные модераторы не могут (такая вот привилегия).

    Использовать числовые величины для понятия с простым отсортированным набором значений удобно тем, что их можно сразу же и сравнивать. А вот когда нам потребуется не просто класс пользователя, а его название, мы можем сделать user_class_names[user_level] и получить нужное имя.
  • Не сломается БД Mariadb, если в её дампе.sql с помощью vim заменить массово кодировку?

    shurshur
    @shurshur
    Легко может сломаться, если название кодировки встретится не в связанных с кодировкой конструкциях SQL, а в значениях полей или - ещё хуже - в именах таблиц, колонок, баз, индексов...
  • Недостатки и альтернативы PyQt?

    shurshur
    @shurshur
    По большому счёту лучше PyQt из широко используемого ничего нет. Разве что использовать веб или электроноподобный eel (в некоторых случаях это может оказаться даже оправдано).
  • Роли в боте вк sql?

    shurshur
    @shurshur
    list(map(int, "Участник"))

    Эм... И что тут имелось в виду? Очевидно, что это выдаст ошибку, потому что попытается применить int к буквам.
  • Куда переехать с Google IMAP/CalDav/CardDav/LDAP со своими доменами?

    shurshur
    @shurshur
    Если хочется развернуть своё, то многие задачи решает проект MailCow. В качестве вебморды вместо SquirrelMail можно RoundCube - он гораздо современее выглядит.
  • Как выдать роль пользователю?

    shurshur
    @shurshur
    Артём Смирнов, и тип str? Если так, то id533386611 - тут id пользователя, надо откусить id и превратить в число. Но проверить, что у пользователей с переопределённым именем (vk.com/что-то) тоже возвращается id-цифры.
  • Как выдать роль пользователю?

    shurshur
    @shurshur
    Артём Смирнов, рекомендую сделать

    print(type(member))
    print(member)

    И посмотреть, что прилетело в качетсве member: строка, id пользователя, какой-нибудь объект...
  • Где можно на примерах посмотреть четкий алгоритм приведения матрицы к ЖНФ?

    shurshur
    @shurshur
    Кто ж так пишет, "хар-многочлен", "2ойка", специально чтобы очень тяжело было понимать?
  • Как получить nick из list?

    shurshur
    @shurshur
    Зачем так сложно, если давно придумали list comprehension?

    nicks = [member["nick"] for member in members["members"]]
  • Выдает ошибку. Что делать?

    shurshur
    @shurshur
    Очевидно, если сообщение не текстовое, то text будет None. Это надо проверять до использоваия lower.