Как вырезать рандомные куски сообщения?

Хочу, чтобы типа из Привет, это как пример что-то получилось похожее на Привет пример, или в этом роде. Вот кусочек из моего кода:

@commands.Cog.listener()
    async def on_message(self, message):
     r = random.randint(0, 50)
     if r > 45:
        количествоаааа = random.randint(0, 200)
        соообщениееаавыафыва = await message.channel.history(limit=200).flatten() #
        if ("@everyone" or "@here" in message.content):
            await message.channel.send('кто-то хотел пингануть евриван или хере в сообщение, но я то троль, паэтаму mq шалава)))))')
        else:
            await message.channel.send(соообщениееаавыафыва[количествоаааа].content)

Ответы (1 шт):

Автор решения: denisnumb

В обработчике сообщений on_message() создадим список (list) words, который будет хранить отдельные слова сообщения, разделенные пробелом

words = message.content.split()

То есть, список words для такого текста ("Это тестовый текст") будет выглядеть так:

['Это', 'тестовый', 'текст']

Затем, при условии, что в списке больше одного слова (иначе нет смысла удалять слова сообщения), создадим еще одну переменную count_to_delete - она будет хранить количество слов, которые мы хотим удалить.

Здесь немного математики)

Например, мы хотим удалить 50% слов. Чтобы определить сколько это от общего числа, нужно разделить общее количество слов на 100 и умножить на 50, а затем привести к целому числу (int), так как мы удалям именно целое число слов:

count_to_delete = int(len(words) / 100 * 50)

Таким образом, из списка words из 3 слов, приведенного выше, будет удалено 1 слово.


Чтобы определить какие именно слова удалять, подключим функцию choice из модуля random

from random import choice

Эта функция случайно выбирает один элемент из приведенного перечисляемого объекта.

Теперь, используя цикл for удалим случайные слова сообщения:

for i in range(count_to_delete):
    words.remove(choice(words))

На выходе получим список со случайно вырезанными словами. Чтобы снова привести его к строке и вернуть пробелы воспользуемся функцией join():

result = ' '.join(words)

Строку result можно отправлять в канал дискорда.


Полный код:

from random import choice

@commands.Cog.listener()
async def on_message(self, message):
    # если автор сообщения - бот, то игнорируем сообщение
    if message.author.bot:
        return

    words = message.content.split()
    if len(words) > 1:
        count_to_delete = int(len(words) / 100 * 50)
        for i in range(count_to_delete):
            words.remove(choice(words))
        await message.channel.send(' '.join(words))
→ Ссылка