Similar presentations:
Программирование на 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