23.37M
Category: programmingprogramming

Программирование на Python. Работа с чатом (урок 33)

1.

Программирование
на Python
Урок 33
Работа с чатом

2.

Ставь + в чат,
если хорошо видно и слышно

3.

Программирование на Python | Работа с чатом
Что будет на уроке сегодня?
Познакомимся с устройством команд для чат бота
Добавим функционал анализа текста в сообщениях
Научим чат бота считывать сообщения пользователей
Научимся банить пользователей, которые
злоупотребляют CAPS LOCK и используют ругательные
слова

4.

Викторина!
Давайте вспомним предыдущий урок =)
Переходим на сайт с викториной по ссылке,
которую отправит преподаватель

5.

Знакомство
с принципом
работы команд

6.

Программирование на Python | Работа с чатом
Как устроены функции в чат-боте
Давайте посмотрим на существующую функцию:
@bot.command()
async def ping(ctx):
await ctx.send("pong")
Она немного похожа на функцию в Flask, которая рендерила страницу. Декоратор @bot.command()
означает, что эта функция является командой для бота. Сама команда определяется в названии функции.
В нашем случае - это ping
await говорит нам о том, что наша функция является асинхронной. То есть её работа не будет
останавливать работу других функций, если они будут. Благодаря этому наш бот сможет делать
несколько дел одновременно!
Ну и дальше описана реакция бота, а именно отправка сообщения "pong" с помощью команды ctx.send

7.

Программирование на Python | Работа с чатом
Отказываемся от префикса
Так как наш бот должен следить за любыми сообщениями в чате и контролировать их, то нам такой
способ работы с ботом не подойдет. Давайте перепишем наш код немного по-другому, руководствуясь
документацией к модулю и сделаем функции бота, которые не будут привязаны к префиксу:
import discord
client = discord.Client()
token = "OTU1NzMzNzgwNjcxMzgxNTE0.Yjl-cQ.s-PS9Y97QZCmePXc1UWPOyqoQws"
client.run(token)
Теперь за работу с чат-ботом будет отвечать другой объект — client.

8.

Программирование на Python | Работа с чатом
Отказываемся от префикса
Напишем функцию ping-pong для нашего клиента:
@client.event
async def on_message(message):
if message.author == client.user:
return
# Чтобы не реагировать на сообщения бота
# Ничего не делаем
if message.content == 'ping':
await message.channel.send('pong')
Здесь все написанные пользователями сообщения будут попадать в параметр message функции
on_message.
Внутри делаем проверку (if message.author == client.user), чтобы бот не обрабатывал свои собственные
сообщения.
Следующая проверка if message.content == 'ping' реагирует на фразу ping. Мы раскрываем содержимое
сообщение с помощью message.content и, если оно равно фразе ping, то отправляем соответствующее
сообщение в чат: message.channel.send('pong')

9.

Программирование на Python | Работа с чатом
Отказываемся от префикса
Запустите получившийся код и проверьте реакцию вашего чат бота:

10.

Программирование на Python | Работа с чатом
Если префикс все-таки нужен
В этом случае, можно воспользоваться уже особенностями python. И проверить, начинается ли строка
с определенного символа. И если да, то реагировать определенным образом. Давайте разберем пример
с приветствием бота через префикс. В той же самой функции def on_message() добавим еще одну
проверку:
if message.content.startswith('$Привет'):
await message.channel.send('Привет, друг!')
Благодаря строковому методу .startswith() Python будет проверять не всю фразу целиком, а только
первые символы. И если они полностью совпадают с указанными (в нашем случае - это $Привет) То бот
среагирует указанным способом (отправит сообщение 'Привет, друг!')

11.

Программирование на Python | Работа с чатом
Что еще умеет бот?
Как вы догадываетесь, возможность отвечать на сообщения - не единственная способность бота. Он
умеет делать еще очень много интересных вещей. Любой функционал боту добавляется с помощью
функции с определенным декоратором. Давайте добавим функционал уведомления о подключении к
чату. Для этого создадим еще одну функцию:
@client.event
async def on_ready():
print(f'Залогинился под именем {client.user}')
Функция on_ready() срабатывает только тогда, когда бот активируется и подключается к чату. Внутри
функции реакция этого бота, а именно вывод информации о том, что он залогинился, и также с помощью
client.user он выводит информацию о своем имени на сервере.

12.

Программирование на Python | Работа с чатом
Самостоятельное задание
1.
2.
Вспомните три своих любимых youtube канала. Настройте бота так, чтобы по команде !youtube,
Бот отправлял бы вам в чат ссылки на эти каналы.
Научите бота возводить в квадрат числа. Чтобы проверить является ли введенное значение
числом, можно воспользоваться методом .isdigit:
if message.content.isdigit():

13.

Перерыв 10 мин

14.

Определяем
CAPS LOCK
в сообщениях

15.

Программирование на Python | Работа с чатом
Функция определения CAPS LOCK
Теперь, когда наш бот умеет читать сообщения, давайте научим его определять, злоупотребляет ли
пользователь CAPS LOCK’ом:
Для этого удобнее будет создать отдельную функцию, которая будет принимать в качестве параметра
текст сообщения и возвращать True, если в сообщении обнаружено злоупотребление CAPS LOCK’ом.
И вернет False, если в сообщении не найдено нарушений:
def checkCaps(text):
countBigLetters = 0
for i in text:
if i.isupper():
countBigLetters += 1
if countBigLetters > len(text) // 2:
return True
return False
# Функция определения CAPS LOCK
# Счетчик количества больших букв
# Цикл перебора букв в сообщении
# Если найдена большая буква
# Увеличиваем счетчик на 1
# Если букв больше,чем половина текста
# Возвращаем True
# Возвращаем False, если нарушений не найдено

16.

Программирование на Python | Работа с чатом
Реакция на сообщения с нарушениями
Теперь, когда есть функция, которая может проверить наше сообщение, можно все сообщения пропускать
через данную функцию. И если функция вернет True, то отреагируем соответствующим образом: выдадим
предупреждение в чат:
if checkCaps(message.content):
# Передаем текст сообщения в проверяющую функцию
await message.channel.send(f'{message.author.mention} в нашем чате запрещено
использовать CAPS LOCK без нужды!')
Теперь каждое сообщение будет пропущено через проверяющую функцию, и если в нем будет больше
половины больших букв, бот выдаст предупреждение:
Здесь мы использовали еще одну конструкцию message.author.mention с помощью которой мы можем
упомянуть автора сообщения, чтобы он наверняка увидел, что нарушил правила чата.

17.

Про баны

18.

Программирование на Python | Работа с чатом
Бан пользователя
Давайте теперь забаним пользователя, который нарушает наши правила. Чтобы это сделать, нам
необходимо уже внутрь существующей функции добавить еще одну команду:
if checkCaps(message.content):
await message.channel.send(f'{message.author.mention} в нашем чате запрещено
использовать CAPS LOCK без нужды!')
await message.author.ban(reason="Злоупотребялял CAPS LOCK")
Здесь мы сначала вычисляем автора сообщения с помощью части команды message.author а затем его
баним, с помощью метода .ban. В скобках с помощью параметра reason указываем причину бана. Это
полезно, если мы потом захотим проверить список забаненных пользователей и узнать за что их бот
забанил.

19.

Программирование на Python | Работа с чатом
Спасаем пользователей из бана
В списке пользователей нарушитель пропадет
и вы его сможете найти уже в списке
забаненных пользователей. Чтобы его
открыть кликаем правой кнопкой мыши по
иконке нашего сервера, выбираем
последовательно пункты Настройки сервера
— Баны. Откроется список забаненных
пользователей:
Если кликнете по пользователю, то можно
увидеть за что он был забанен. И если
хотите дать ему второй шанс, то разбаньте
его, нажав соответствующую кнопку:

20.

Программирование на Python | Работа с чатом
Уведомление пользователю о бане
Чтобы бот безмолвно не удалял пользователя с сервера, важно сообщить о причинах такого поступка
в личных сообщениях. Для этого перед командой удаления добавим еще одну, которая сначала пришлет
личное сообщение нарушителю, а потом забанит его:
if checkCaps(message.content):
await message.author.send('Вы были забанены по причине злоупотребления CAPS LOCK.'
'Для разбана обратитесь к администратору сервера')

Перезапустите сервер и попросите вашего
друга снова отправить CAPS LOCK сообщение в
чат. Теперь бот будет уведомлять нарушителя о
том, за что его забанили:

21.

Программирование на Python | Работа с чатом
Забанить или выгнать?
Если вы считаете, что бан слишком серьезное наказание для такого поступка, то можно просто выгнать
пользователя из вашего сервера. Правда в этом случае он сможет снова присоединиться, если найдет
ссылку-приглашение. Для того чтобы просто выгнать пользователя, поменяйте команду бана
и информационное сообщение на другие:
if checkCaps(message.content):
await message.author.send('Вы были выгнаны по причине злоупотребления CAPS LOCK.')
await message.channel.send(f'{message.author.mention} в нашем чате запрещено
использовать CAPS LOCK без нужды!')
await message.author.kick(reason="Злоупотребялял CAPS LOCK")

22.

Информационные
сообщения от бота

23.

Программирование на Python | Работа с чатом
Функция вывода информационного сообщения
В Discord есть возможность значимые события оформлять в рамки. Давайте для события бана создадим
функцию которая будет формировать нам такую рамку. Функция будет принимать в себя пользователянарушителя и причину бана:
def makeBanEmbed(author, reason):
emb = discord.Embed(title='Нарушение правил чата', colour=discord.Color.red())
emb.set_author(name=author.name, icon_url=author.avatar_url)
emb.add_field(name='Бан пользователя', value=f'Пользователь {author.mention} был забанен')
emb.set_footer(text=f'Причина бана: {reason}')
return emb
discord.Embed() — сама специальная рамка
set_author() — автор сообщения
add_field() — внутреннее поле для информации
set_footer() — нижняя часть сообщения и возвращаем получившуюся конструкцию

24.

Программирование на Python | Работа с чатом
Функция вывода информационного сообщения
В самом коде с проверкой мы сохраняем результат работы функции в переменную,
чтобы потом её просто вывести в чат. Переделанный код выглядит так:
if checkCaps(message.content):
reason = 'Злоупотребление CAPS LOCK'
await message.channel.purge(limit=1)
# Удаляем последнее сообщение
await message.author.send(f'Вы были выгнаны по причине: {reason}')
await message.author.ban(reason=reason)
# Баним пользователя
emb = makeBanEmbed(message.author, reason)
# Получаем рамку
await message.channel.send(embed=emb)
# Выводим на экран рамку

25.

Программирование на Python | Работа с чатом
Функция вывода информационного сообщения
В итоге, получаем более интересное информационное сообщение при нарушении правил:
Внимание! Разбаненные пользователи не возвращаются автоматически на сервер.
Нужно снова прислать им ссылку с приглашением на сервер.

26.

Баним
за плохие слова

27.

Программирование на Python | Работа с чатом
Создаем список плохих слов
Сделать это нужно заранее в том же месте где создавали дополнительные функции.
Вот пример списка плохих слов:
bad_words = ['дурак', 'козел', 'идиот']
Заполнять этот список можно бесконечно, если вы увидели новое слово в чате,
которое вам не нравится, то добавьте его в список плохих слов и перезапустите код бота.

28.

Программирование на Python | Работа с чатом
Функция проверки на плохие слова
Функция также будет принимать в себя сообщение, анализировать его и возвращать True,
если были найдены плохие слова. И False, если плохих слов не обнаружено:
def checkBadWords(text):
wordsInText = text.split()
for word in wordsInText:
if word in bad_words:
return True
return False
# Делим сообщение на слова по пробелам
# Делим список получившихся слов
# Если проверяемое слово есть в списке bad_words

29.

Программирование на Python | Работа с чатом
Самостоятельное задание
А теперь по подобию того, как был написан код на бан за CAPS LOCK, напишите
код бана за плохие слова с созданием соответствующего сообщения внутри чата.

30.

Программирование на Python | Работа с чатом
Итоги
Познакомились с устройством функция для управления ботом
Научились следить за сообщениями в чате
Узнали как эффективно использовать префиксы
Научили бота отслеживать CAPS LOCK и плохие слова
Научились банить пользователей за нарушение правил
Создали информационное окно для вывода событий

31.

Программирование на Python | Работа с чатом
На следующем занятии
Спроектируем систему подсчета опыта и уровней
Напишем условия начисления опыта за сообщения
Создадим базу данных пользователей и их уровней

32.

Повторим
пройденное

33.

Может ли бот реагировать
на сообщения без префикса?

34.

Какая команда позволяет получить
содержимое отправленного сообщения?

35.

В чем разница между баном и киком?

36.

Как лучше всего уведомить
пользователя о бане на сервере?

37.

Ваши вопросы

38.

Спасибо
за внимание

39.

Домашнее задание

40.

Заполни, пожалуйста,
форму обратной связи по уроку

41.

Напоминание для преподавателя
Проверить заполнение Журнала
Заполнить форму Т22
English     Русский Rules