Discord Discord Bot #1 Первые шаги

Префикс для тем посвященных тематики Discord

Chaka

Новичок
Регистрация
27 Дек 2020
Сообщения
5
Реакции
6
Привет Диплерчане!
В этой теме вы узнаете как создать своего бота в дискорде, а так же, как можно с самого начала структурировать свой код.

Начнем создание бота, гайды по которому вы найдете практически везде... Но на форуме вы сможете напрямую спросить, что именно вас интересует в данной сфере - я же в свою очередь попытаюсь как можно скорее вам ответить. Начнем!



Что требуется для самого начала:
  1. Войти в Discord аккаунт по ссылке
  2. Во вкладе Applications нажать на кнопку New Application и дать название
  3. Перейдите в только что созданное приложение.
  4. Нажмите в списке Settings на вкладку Bot, затем на "Add bot". Дайте ему название
  5. Получите токен бота, нажав на Copy
  6. Сохранить где-нибудь токен
Теперь:
  1. В той же вкладке, где создавали бота, проскроллить вниз до Privileged Gateway Intents
  2. Включить в этом разделе 2 параметра PRESENCE INTENT и SERVER MEMBERS INTENT
Молодцы! Вы создали бота. Давайте теперь пригласим его на наш сервер.
  1. Снова зайдите в своего бота
  2. Найдите в списке Settings вкладку OAuth2
  3. В окне Scopes поставь галочку на Bot
  4. Ниже появится еще одно окно Bot permission. Поставьте галочку на Administrator
  5. Выше, где вы ставили галочку Bot есть ссылка - копируете ее и в новой вкладке вставляете в поиск
  6. Приглашаете бота
В дальнейшем, когда вы будете понимать, какого бота пишете или уже написали бота - выбирайте только нужные разрешения для бота.
Теперь перейдем к написанию кода, но для этого нам нужен удобный редактор. К счастью, у нас есть замечательный кандидат на эту работу - PyCharm. Качаем PyCharm Community



Теперь запустите программу и создайте новый проект.
Вам нужно:
  1. Запустить PyCharm
  2. Настроить его под свой вкус
  3. Тыкнуть на New Project
  4. Назвать свой проект
  5. Тыкнуть на Create
Вы создали проект.

Если у вас не появился файл main.py, то создайте его, тыкнув правой кнопкой мыши в редакторе по главной папке, которую только что создали, затем нажмите в выпавшем окне New -> Python File и назовите его как хотите, главное помнить - этот файл будет главным, из которого будут запускаться все функции бота.

Вот теперь то и начинается все самое интересное и трудное. Мы будем сразу использовать коги. Они позволят нам структруировать наш проект по папкам и отдельным файлам, где в свою очередь будет очень легко ориентироваться. Чтобы сделать запуск всех функций, нам нужно создать папку "cogs". Можете ее тоже как угодно назвать, главное в цикле запуска укажите верное имя. Так же я создам папку config.py, где буду хранить свои данные, чтобы не спалить их здесь :)

Должно получиться вот так:



Вот какой код будет запускать нам функции:
Python:
for filename in os.listdir('cogs'):
    if filename.endswith('.py'):
        py.load_extension(f'cogs.{filename[:-3]}')
Все предельно просто, но давайте сначала напишем само тело бота.
Импортируем библиотеки discord и commands из discord.ext
Python:
import discord
from discord.ext import commands

intents = discord.Intents.all()
py = commands.Bot(command_prefix='!', intents=intents)
py.remove_command('help')

@py.event
async def on_ready():
    print('Бот запущен')

py.run('Nzk4NTUzNjUwMDMyNjcyODA5.X_2tCg.OZf3Oqxx8OGyl3nNQBobecHv57c')
command_prefix='!' - это знак или буква, смотря что вы предпочитаете, с которого будут вызываться все функции бота. Я буду использовать "!".
py = commands.Bot(command_prefix='!', intents=intents) этой строкой вы будете выполнять различные операции/обращения к API Дискорда.
Назвать вы ее можете как угодно.
Например так:
bot = commands.Bot(command_prefix='!', intents=intents)
Следовательно теперь цикл запуска всех функций будет выглядеть так:
Python:
for filename in os.listdir('cogs'):
    if filename.endswith('.py'):
        bot.load_extension(f'cogs.{filename[:-3]}')
Пока что мы закончили лишь тело нашего бота. Для проверки мы можем запустить его, нажав Shift+F10 в редакторе PyCharm
В терминале у вас должно вывестись сообщение "Бот запущен", а в дискорде бот должен появиться в сети.

Думаю, все понятно. Идем дальше...

py.run(ВАШ ТОКЕН) - вот этот момент как раз и запускает вашего бота. Весь код должен быть написан ДО него. Все, что будет написано после данной строчки - будет игнорироваться.

Идем дальше.
Напишем наши первые команды. Они будут загружать/отключать/перезагружать наши функции в папке cogs. Сразу же напишем в этих функциях проверку на вас, чтобы кроме вас никто не мог воспользоваться данной функцией:

Для начала импортируем еще одну библиотеку - import os она позволит нам составить навигацию по папкам из главного файла.
Python:
@py.command()
async def load(ctx, extension):
    if ctx.author.id == 0:  # Свой ID
        py.load_extension(f"cogs.{extension}")
        await ctx.send('Коги подгружены.')
    else:
        await ctx.send('У вас нет доступа к данной команде.')

@py.command()
async def unload(ctx, extension):
    if ctx.author.id == 0:  # Свой ID
        py.unload_extension(f"cogs.{extension}")
        await ctx.send('Коги разгружены.')
    else:
        await ctx.send('У вас нет доступа к данной команде.')

@py.command()
async def reload(ctx, extension):
    if ctx.author.id == 0:  # Свой ID
        py.unload_extension(f"cogs.{extension}")
        py.load_extension(f"cogs.{extension}")
        await ctx.send('Ког перезагружен.')
    else:
        await ctx.send('У вас нет доступа к данной команде.')
Если сейчас вы попытаетесь запустить бота, то вы получите ошибку. Скоро мы это исправим, вам сначала надо понять, как это все работает.

Чтобы узнать свой айди, нужно тыкнуть правой кнопкой мыши в дискорде по себе, затем "Копировать ID"
Если у вас нет данной кнопки, значит вам нужно включить "Режим разработчика" в настройках дискорда



Вы тоже можете использовать config.py, чтобы хранить там ключи.
Для этого создаем файл config.py если вы еще этого не сделали и пишем в нем следующее:
ID = Свой ID
Затем, в файле main.py в самом верху пишем from config import ID
Затем слово ID вставляем вместо циферок в командах, то есть:

Python:
async def load(ctx, extension):
    if ctx.author.id == ID:
        py.load_extension(f"cogs.{extension}")
        await ctx.send('Коги подгружены.')
    else:
        await ctx.send('У вас нет доступа к данной команде.')

@py.command()
async def unload(ctx, extension):
    if ctx.author.id == ID:
        py.unload_extension(f"cogs.{extension}")
        await ctx.send('Коги разгружены.')
    else:
        await ctx.send('У вас нет доступа к данной команде.')

@py.command()
async def reload(ctx, extension):
    if ctx.author.id == ID:
        py.unload_extension(f"cogs.{extension}")
        py.load_extension(f"cogs.{extension}")
        await ctx.send('Ког перезагружен.')
    else:
        await ctx.send('У вас нет доступа к данной команде.')
Как стало все намного легче, не правда ли? Правда мы слишком долго сидим уже на месте, руки чешутся написать первую настоящую функцию! Тогда приступаем!

В папке cogs создадим файл test.py.



Импортируем from discord.ext import commands и пишем:
Python:
class Testing(commands.Cog):
    def __init__(self, py):
        self.py = py
   
def setup(py):
    py.add_cog(Testing(py))

Вот наконец можно снова пробовать запустить бота! Запустился? Идем дальше!

Напишем простую функцию hello:
Код в этом файле должен сейчас выглядеть вот так.
Python:
from discord.ext import commands

class Testing(commands.Cog):
    def __init__(self, py):
        self.py = py

    @commands.command()
    async def hello(self, ctx):
        await ctx.send('Hi!')

def setup(py):
    py.add_cog(Testing(py))
Запустим бота и проверим, все ли в порядке.



Замечательно! Наш бот откликается на команды.

Давайте под конец заставим его откликаться на наши сообщения в чате:
Python:
from discord.ext import commands

class Testing(commands.Cog):
    def __init__(self, py):
        self.py = py

    @commands.Cog.listener()
    async def on_message(self, message):
        await message.channel.send('Ты написал сообщение!')

def setup(py):
    py.add_cog(Testing(py))
Вот только не задача, да? Бот начинает нам флудить сообщениями



а все потому, что он откликается и на свое же сообщение. Чтобы этого избежать, добавим одно условие:
Python:
    @commands.Cog.listener()
    async def on_message(self, message):
        if message.author.bot:
            return
        await message.channel.send('Ты написал сообщение!')

Думаю на этом можно закончить, может в некоторых местах я не понятно объяснил - не бойтесь спрашивать.
Всем удачи, всем пока!
 

Valstan

Новичок
Регистрация
13 Янв 2021
Сообщения
2
Реакции
1
Аффигеть, расписано всё красиво, доберусь до компа - обязательно попробую! Продолжай, у тебя получается!
 

lobiol

Новичок
Регистрация
12 Июл 2017
Сообщения
9
Реакции
3
А какой язык то лучше использовать? Java? Phyton?
 

Chaka

Новичок
Регистрация
27 Дек 2020
Сообщения
5
Реакции
6
А какой язык то лучше использовать? Java? Phyton?
С java не знаком, а этот курс будет чисто на python. Так что выбрать, что лучше, не могу

Добавлю: питон очень легок в освоении, поэтому рекомендую начинать прогать с него
 
Сверху Снизу