Гайд #1 | Курс "Бот дискорд на python" | Ивенты, команды | disnake

аоууеоооы
Пользователь
Статус
Оффлайн
Регистрация
22 Сен 2020
Сообщения
67
Реакции[?]
33
Поинты[?]
2K
Ещё раз всем хай, это первый (ну получается второй) гайд в данном курсе:

#0 | Подготовка (установка python/disnake, создание бота) (ссылка)
#1 | Ивенты, команды | данный этап
#2 | Слэш-команды, обработка ошибок
#3 | Разделение кода (cogs)
#4 | Кнопки, выпадающие меню
#5 | Хостинг бота на сервере

Курс спонсирован напитком экстра-ситро :roflanEbalo:
Просьба писать код вдумчиво, не просто копипастить.
Моя цель - чтобы те, кто ничего незнает, хоть чему-нибудь научились.

1. Начинаем писать бота
Создайте 2 файла:
bot.py - наш основной файл с ботом
config.py - файл с конфигурацией (токен, префикс и т.п.)
Для того чтобы начать писать команды или ивенты, надо написать базовый код:

>> bot.py:
1. Импортируем библиотеку disnake и commands
import disnake
from disnake.ext import commands

2. Сделаем переменную с нашим ботом:
Мы можем использовать disnake.Client:
bot = disnake.Client(intents=disnake.Intents.all())
Но я буду использовать commands.Bot
(он принимает такие же параметры, как Client):
bot = commands.Bot(intents=disnake.Intents.all(), command_prefix=config["prefix"])

Можно ещё импортировать из disnake Intents, чтобы получилось покрасивее
Python:
from disnake import Intents # импортируем Intents
bot = commands.Bot(intents=Intents.all(), command_prefix=config["prefix"]) # вместо disnake.Intents.all() - Intents.all()
Делайте как хотите

Также если вы работаете в Visual Studio Code, PyCharm (и других), можно посмотреть
какие аргументы принимает та или иная функция - просто наведитесь на неё курсором
Screenshot_54.png
3. Вставляете ниже запуск нашего бота:
bot.run(config["token"])

>> config.py:
Чтобы наш config["token"] выдавал наш токен и config["prefix"] выдавал наш префикс нам нужно создать конфиг:
1. Открываем config.py
2.
Пишем в нём:
config.py:
config = {
    'token': 'TOKEN', # токен из #0 гайда
    'prefix': '!' # наш префикс
}
Далее вы можете добавлять свои переменные и вызывать их вот так: config["prefix"]
3. В bot.py пишем рядом с нашими импортами: from config import config
Это позволит использовать переменные config в bot.py


После данного этапа у нас должно получится примерно так:
Screenshot_56.png

2. Ивенты
Если вы хотите автоматически отслеживать те или иные действия на вашем сервере (кто на него зашёл, кого забанили, кто зашёл в определенный войс), то нам нужны ивенты.
Их существует множество, все они есть в документации -
Пожалуйста, авторизуйтесь для просмотра ссылки.

Мы разберём три ивента - on_ready, on_member_ban, on_member_join:

1. on_ready:
Данный ивент вызывается когда бот полностью запускается, мы будем использовать его чтобы поставить какой-нибудь смешной статус и вывести сообщение в консоль:

Python:
@bot.event
async def on_ready():
    await bot.change_presence(status=disnake.Status.online, activity=disnake.Game("ебашит гайды"))
    print(f"{bot.user.name} logged in.")
Запускаем нашего бота и получается примерно так:
Screenshot_55.png
Вы можете менять статус и активность, все доступные статусы и активности есть тут -
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
Пожалуйста, авторизуйтесь для просмотра ссылки.

Вот код который ставит "Не беспокоить" и Слушает пользователей:
await bot.change_presence(status=disnake.Status.do_not_disturb, activity=disnake.Activity(type=disnake.ActivityType.listening, name="пользователей")
Пожалуйста, авторизуйтесь для просмотра ссылки.

Также можно подключить там какую-нибудь ДБ, чтобы потом с ней взаимодействовать (для примера).
2. on_member_ban:
Данный ивент вызывается когда пользователя банят (не выгоняют), мы будем использовать его чтобы написать в определенный канал, что пользователь забанен.
Он отправляет объект сервера и пользователя - guild и user, guild - сервер в котором пользователя забанили и user - пользователь которого забанили.
Мы будем использовать только user.
Для нахождения канала по ID используем метод get_channel(id)
Python:
@bot.event
async def on_member_ban(guild:disnake.Guild, user: disnake.Member):
    channel = await bot.get_channel(1107292203912544338) # получение канала #баны
    await channel.send(f"Пользователь {user.name}#{user.discriminator} был забанен.") # вывод сообщения о бане
Можно также вывести в виде embed:
Python:
@bot.event
async def on_member_ban(guild:disnake.Guild, user: disnake.Member):
    channel = await bot.get_channel(1107292203912544338) # получение канала #баны
    emb = disnake.Embed(title="Ещё один бан", description=f"Пользователь {user.name}#{user.discriminator} был забанен") #создание embed
    await channel.send(embed=emb) # вывод embed'a в чат
Можно кастомизировать по своему
Сообщение при бане -
Пожалуйста, авторизуйтесь для просмотра ссылки.
3. on_member_join:
Данный ивент вызывается, когда пользователь заходит на наш сервер, мы будем использовать его чтобы написать в определенный канал, что пользователь присоединился к нам.
Он отправляет объект пользователя - user.
Для нахождения канала по ID используем метод get_channel(id)
Python:
@bot.event
async def on_member_join(user: disnake.Member):
    channel = await bot.get_channel(1107267042865848351) # получение канала #приглашения
    await channel.send(f"{user.mention} присоединился к нам!") # отправка сообщения
Можно вывести в embed, как в on_member_ban и сделать также с методом on_member_remove - это когда пользователь выходит с нашего сервера.
Сообщение при подключении пользователя -
Пожалуйста, авторизуйтесь для просмотра ссылки.
Для получения ID нужно включить в настройках: Настройки -> Расширенные -> Режим разработчика, потом ЛКМ по каналу -> Копировать ID канала

3. Команды
Мы будем рассматривать слеш-команды в следующем гайде, а пока сделаем команды как в старые добрые, с помощью префикса
Мы сделаем команду say(пишет ваш текст, который вы написали в аргументах), ban и kick

1. say
Данная команда напишет ваш текст, например, у вас есть канал в котором вы хотите писать от имени бота.
Python:
@bot.command()
async def say(ctx: disnake.Message, *, text): # получение текста, который вы напишите
    await ctx.message.delete() # удаление сообщения
    await ctx.send(text) # отправка сообщения
Вывод:
Пожалуйста, авторизуйтесь для просмотра ссылки.
2. ban и kick
Данная команда забанит/кикнет пользователя, которого вы упомяните:
Python:
@bot.command()
async def kick(ctx: disnake.Message, member: disnake.Member):
    await ctx.message.delete() # удаление сообщения
    await member.kick()# кик пользователя
    ms = await ctx.send(f"{member.display_name} был кикнут с сервера.") # отправка сообщения
    await asyncio.sleep(3) # ожидание 3 секунды
    await ms.delete() # удаление сообщения

@bot.command()
async def ban(ctx: disnake.Message, member: disnake.Member):
    await ctx.message.delete() # удаление сообщения
    await member.ban() # бан пользователя
    ms = await ctx.send(f"{member.display_name} был забанен на сервере.")# отправка сообщения
    await asyncio.sleep(3) # ожидание 3 секунды
    await ms.delete() # удаление сообщения
Для работы asyncio.sleep(3) импортируйте asyncio -> import asyncio или добавьте к disnake import disnake, asyncio
4. Запуск
Можно запустить из visual studio code, если вы там пишите бота,
Пожалуйста, авторизуйтесь для просмотра ссылки.

Или сделать start.bat в папке с bot.py cо следующим кодом:
Код:
@echo off
python bot.py
pause>nul
и открыть его.
На этом всё, делайте своих ботов.
Для связи: aristocratos#4840, только писать
Профессионалы могут указать на мои ошибки)
Спасибо, скоро увидимся :CoolCat:
 
Последнее редактирование:
аоууеоооы
Пользователь
Статус
Оффлайн
Регистрация
22 Сен 2020
Сообщения
67
Реакции[?]
33
Поинты[?]
2K
аоууеоооы
Пользователь
Статус
Оффлайн
Регистрация
22 Сен 2020
Сообщения
67
Реакции[?]
33
Поинты[?]
2K
1684081130672.png
вот так вот, там то зачем убрал отступы :NotLikeThis:
 
Начинающий
Статус
Оффлайн
Регистрация
28 Июл 2021
Сообщения
126
Реакции[?]
9
Поинты[?]
0
ЧВК YAROSLAV
Забаненный
Статус
Оффлайн
Регистрация
25 Дек 2019
Сообщения
594
Реакции[?]
183
Поинты[?]
31K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как же ты насрал, какой нафиг диснейк, через него ты даже не сделаешь эмбеды. запуск бота ваще через говно идет

client.run('токен') для аутистов епт
 
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2019
Сообщения
650
Реакции[?]
141
Поинты[?]
30K
А у вас тоже ctx это disnake.Message, а не disnake.ext.commands.Context, ну а вообще гайд на уровне хауди хо, ты бы еще ебанул pass_context. Да и хранить в конфиге словарь, с данными, это что-то новое, можно много до чего доебаться, но я на истории
delete_after=3 идет нахуй, весь гайд можно заменить ссылкой на документацию
 

Вложения

Эксперт
Статус
Оффлайн
Регистрация
10 Фев 2021
Сообщения
1,740
Реакции[?]
559
Поинты[?]
2K
А у вас тоже ctx это disnake.Message, а не disnake.ext.commands.Context, ну а вообще гайд на уровне хауди хо, ты бы еще ебанул pass_context. Да и хранить в конфиге словарь, с данными, это что-то новое, можно много до чего доебаться, но я на истории
delete_after=3 идет нахуй, весь гайд можно заменить ссылкой на документацию
Бедняга же расстроится, рассказал что знает, а тут такое ему пишут. Я конечно тоже понимаю, что гайд говна, но можно было чуть вежливо ответить.
А так браток хорош развеивайся и используй лучше обычную библиотеку discord.py, так как она, думаю, надежнее)
 
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2019
Сообщения
650
Реакции[?]
141
Поинты[?]
30K
Бедняга же расстроится, рассказал что знает, а тут такое ему пишут. Я конечно тоже понимаю, что гайд говна, но можно было чуть вежливо ответить.
А так браток хорош развеивайся и используй лучше обычную библиотеку discord.py, так как она, думаю, надежнее)
disnake и discord.py это условно одно и тоже, ибо форк, Дэнни бросил d.py когда начали появляться интеракции, поэтому там отличается только это
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,595
Реакции[?]
603
Поинты[?]
44K
Ещё раз всем хай, это первый (ну получается второй) гайд в данном курсе:

#0 | Подготовка (установка python/disnake, создание бота) (ссылка)
#1 | Ивенты, команды | данный этап
#2 | Слэш-команды, обработка ошибок
#3 | Разделение кода (cogs)
#4 | Кнопки, выпадающие меню
#5 | Хостинг бота на сервере

Курс спонсирован напитком экстра-ситро :roflanEbalo:
Просьба писать код вдумчиво, не просто копипастить.
Моя цель - чтобы те, кто ничего незнает, хоть чему-нибудь научились.

1. Начинаем писать бота
Создайте 2 файла:
bot.py - наш основной файл с ботом
config.py - файл с конфигурацией (токен, префикс и т.п.)
Для того чтобы начать писать команды или ивенты, надо написать базовый код:

>> bot.py:
1. Импортируем библиотеку disnake и commands
import disnake
from disnake.ext import commands

2. Сделаем переменную с нашим ботом:
Мы можем использовать disnake.Client:
bot = disnake.Client(intents=disnake.Intents.all())
Но я буду использовать commands.Bot
(он принимает такие же параметры, как Client):
bot = commands.Bot(intents=disnake.Intents.all(), command_prefix=config["prefix"])

Можно ещё импортировать из disnake Intents, чтобы получилось покрасивее
Python:
from disnake import Intents # импортируем Intents
bot = commands.Bot(intents=Intents.all(), command_prefix=config["prefix"]) # вместо disnake.Intents.all() - Intents.all()
Делайте как хотите

Также если вы работаете в Visual Studio Code, PyCharm (и других), можно посмотреть
какие аргументы принимает та или иная функция - просто наведитесь на неё курсором
Посмотреть вложение 247749
3. Вставляете ниже запуск нашего бота:
bot.run(config["token"])

>> config.py:
Чтобы наш config["token"] выдавал наш токен и config["prefix"] выдавал наш префикс нам нужно создать конфиг:
1. Открываем config.py
2.
Пишем в нём:
config.py:
config = {
    'token': 'TOKEN', # токен из #0 гайда
    'prefix': '!' # наш префикс
}
Далее вы можете добавлять свои переменные и вызывать их вот так: config["prefix"]
3. В bot.py пишем рядом с нашими импортами: from config import config
Это позволит использовать переменные config в bot.py


После данного этапа у нас должно получится примерно так:
Посмотреть вложение 247751

2. Ивенты
Если вы хотите автоматически отслеживать те или иные действия на вашем сервере (кто на него зашёл, кого забанили, кто зашёл в определенный войс), то нам нужны ивенты.
Их существует множество, все они есть в документации -
Пожалуйста, авторизуйтесь для просмотра ссылки.

Мы разберём три ивента - on_ready, on_member_ban, on_member_join:

1. on_ready:
Данный ивент вызывается когда бот полностью запускается, мы будем использовать его чтобы поставить какой-нибудь смешной статус и вывести сообщение в консоль:

Python:
@bot.event
async def on_ready():
    await bot.change_presence(status=disnake.Status.online, activity=disnake.Game("ебашит гайды"))
    print(f"{bot.user.name} logged in.")
Запускаем нашего бота и получается примерно так:
Посмотреть вложение 247752
Вы можете менять статус и активность, все доступные статусы и активности есть тут -
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
Пожалуйста, авторизуйтесь для просмотра ссылки.

Вот код который ставит "Не беспокоить" и Слушает пользователей:
await bot.change_presence(status=disnake.Status.do_not_disturb, activity=disnake.Activity(type=disnake.ActivityType.listening, name="пользователей")
Пожалуйста, авторизуйтесь для просмотра ссылки.

Также можно подключить там какую-нибудь ДБ, чтобы потом с ней взаимодействовать (для примера).
2. on_member_ban:
Данный ивент вызывается когда пользователя банят (не выгоняют), мы будем использовать его чтобы написать в определенный канал, что пользователь забанен.
Он отправляет объект сервера и пользователя - guild и user, guild - сервер в котором пользователя забанили и user - пользователь которого забанили.
Мы будем использовать только user.
Для нахождения канала по ID используем метод get_channel(id)
Python:
@bot.event
async def on_member_ban(guild:disnake.Guild, user: disnake.Member):
    channel = await bot.get_channel(1107292203912544338) # получение канала #баны
    await channel.send(f"Пользователь {user.name}#{user.discriminator} был забанен.") # вывод сообщения о бане
Можно также вывести в виде embed:
Python:
@bot.event
async def on_member_ban(guild:disnake.Guild, user: disnake.Member):
    channel = await bot.get_channel(1107292203912544338) # получение канала #баны
    emb = disnake.Embed(title="Ещё один бан", description=f"Пользователь {user.name}#{user.discriminator} был забанен") #создание embed
    await channel.send(embed=emb) # вывод embed'a в чат
Можно кастомизировать по своему
Сообщение при бане -
Пожалуйста, авторизуйтесь для просмотра ссылки.
3. on_member_join:
Данный ивент вызывается, когда пользователь заходит на наш сервер, мы будем использовать его чтобы написать в определенный канал, что пользователь присоединился к нам.
Он отправляет объект пользователя - user.
Для нахождения канала по ID используем метод get_channel(id)
Python:
@bot.event
async def on_member_join(user: disnake.Member):
    channel = await bot.get_channel(1107267042865848351) # получение канала #приглашения
    await channel.send(f"{user.mention} присоединился к нам!") # отправка сообщения
Можно вывести в embed, как в on_member_ban и сделать также с методом on_member_remove - это когда пользователь выходит с нашего сервера.
Сообщение при подключении пользователя -
Пожалуйста, авторизуйтесь для просмотра ссылки.
Для получения ID нужно включить в настройках: Настройки -> Расширенные -> Режим разработчика, потом ЛКМ по каналу -> Копировать ID канала

3. Команды
Мы будем рассматривать слеш-команды в следующем гайде, а пока сделаем команды как в старые добрые, с помощью префикса
Мы сделаем команду say(пишет ваш текст, который вы написали в аргументах), ban и kick

1. say
Данная команда напишет ваш текст, например, у вас есть канал в котором вы хотите писать от имени бота.
Python:
@bot.command()
async def say(ctx: disnake.Message, *, text): # получение текста, который вы напишите
    await ctx.message.delete() # удаление сообщения
    await ctx.send(text) # отправка сообщения
Вывод:
Пожалуйста, авторизуйтесь для просмотра ссылки.
2. ban и kick
Данная команда забанит/кикнет пользователя, которого вы упомяните:
Python:
@bot.command()
async def kick(ctx: disnake.Message, member: disnake.Member):
    await ctx.message.delete() # удаление сообщения
    await member.kick()# кик пользователя
    ms = await ctx.send(f"{member.display_name} был кикнут с сервера.") # отправка сообщения
    await asyncio.sleep(3) # ожидание 3 секунды
    await ms.delete() # удаление сообщения

@bot.command()
async def ban(ctx: disnake.Message, member: disnake.Member):
    await ctx.message.delete() # удаление сообщения
    await member.ban() # бан пользователя
    ms = await ctx.send(f"{member.display_name} был забанен на сервере.")# отправка сообщения
    await asyncio.sleep(3) # ожидание 3 секунды
    await ms.delete() # удаление сообщения
Для работы asyncio.sleep(3) импортируйте asyncio -> import asyncio или добавьте к disnake import disnake, asyncio
4. Запуск
Можно запустить из visual studio code, если вы там пишите бота,
Пожалуйста, авторизуйтесь для просмотра ссылки.

Или сделать start.bat в папке с bot.py cо следующим кодом:
Код:
@echo off
python bot.py
pause>nul
и открыть его.
На этом всё, делайте своих ботов.
Для связи: aristocratos#4840, только писать
Профессионалы могут указать на мои ошибки)
Спасибо, скоро увидимся :CoolCat:
неа.

конфиг файл с апи токеном??? ахахах найс

конфиг файл с .py разрешением потому что тебе лень парсить ямл/томл? ахахах найс

предположим что я работаю в пайчарме, и я не ебу что я делаю - я нажимаю на new project и у меня заводится виртуаленв. че, как мне импортнуть твой диснейк?)) непонятно...
upd: не заметил твой гайд по "подготовке"... ты же в курсе что при переносе проекта на другой компыч у меня нихуя не запустится? ты же слышал про poetry, наверное?)

почему вы так противитесь уже установленному стандарту структуры cli приложений на питоне..

ОЙ КАК НЕУДОБНО ПОЛУЧИЦА когда я захочу импортнуть этот bot.py для вызова какого нибудь коллбека а у меня бот запустится..

лайк за старание и перевод документации👍👍👍
 
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2019
Сообщения
650
Реакции[?]
141
Поинты[?]
30K
неа.

конфиг файл с апи токеном??? ахахах найс

конфиг файл с .py разрешением потому что тебе лень парсить ямл/томл? ахахах найс

предположим что я работаю в пайчарме, и я не ебу что я делаю - я нажимаю на new project и у меня заводится виртуаленв. че, как мне импортнуть твой диснейк?)) непонятно...
upd: не заметил твой гайд по "подготовке"... ты же в курсе что при переносе проекта на другой компыч у меня нихуя не запустится? ты же слышал про poetry, наверное?)

почему вы так противитесь уже установленному стандарту структуры cli приложений на питоне..

ОЙ КАК НЕУДОБНО ПОЛУЧИЦА когда я захочу импортнуть этот bot.py для вызова какого нибудь коллбека а у меня бот запустится..

лайк за старание и перевод документации👍👍👍
Зачем в bot.py держать какие-то каллбеки?
 
Сверху Снизу