Разбор discordgo components example (main.go)

Разбор discordgo components example (main.go)

Вот прямая ссылка на пример, о котором ты говоришь: https://github.com/bwmarrin/discordgo/blob/master/examples/components/main.go

Разберу, как он работает — по сути это пример Discord-бота на Go с кнопками и select-меню (components).


1. Что это вообще за пример

Это пример из библиотеки DiscordGo — низкоуровневого клиента для Discord API.

Он показывает:

  • как создать бота
  • как отправить сообщение с компонентами (buttons / select menu)
  • как обрабатывать нажатия

Компоненты — это интерактивные элементы сообщений (кнопки, списки).


2. Основной поток программы

(1) Парсинг аргументов

В начале:

var (
    Token string
    Guild string
    AppID string
)

И дальше через flag:

flag.StringVar(&Token, "token", "", "Bot token")

➡️ Ты передаёшь:

  • токен бота
  • ID сервера
  • ID приложения

(2) Создание сессии Discord

dg, err := discordgo.New("Bot " + Token)

Это:

  • открывает соединение с Discord API
  • создаёт объект Session

📌 В DiscordGo всё крутится вокруг Session — через неё отправляются сообщения и приходят события.


(3) Регистрация обработчиков событий

dg.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) {

➡️ Это главный момент

Ты подписываешься на событие:

InteractionCreate

Оно приходит когда:

  • нажали кнопку
  • выбрали в select меню

3. Как обрабатываются кнопки

Внутри handler-а обычно:

switch i.Type {
case discordgo.InteractionMessageComponent:

➡️ Это значит:

пользователь нажал кнопку или select

Дальше:

data := i.MessageComponentData()

Ты получаешь:

  • CustomID — ID кнопки
  • значения select меню

Пример логики

switch data.CustomID {
case "button_1":
    // действие 1
case "button_2":
    // действие 2
}

➡️ CustomID — это ключевая штука
Ты сам задаёшь его при создании кнопки


4. Ответ на нажатие

s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
    Type: discordgo.InteractionResponseChannelMessageWithSource,
    Data: &discordgo.InteractionResponseData{
        Content: "Ты нажал кнопку!",
    },
})

➡️ Это:

  • отправляет ответ пользователю
  • можно изменить сообщение или отправить новое

5. Где создаются кнопки

При отправке сообщения:

s.ChannelMessageSendComplex(channelID, &discordgo.MessageSend{
    Content: "Нажми кнопку",
    Components: []discordgo.MessageComponent{
        discordgo.ActionsRow{
            Components: []discordgo.MessageComponent{
                discordgo.Button{
                    Label:    "Кнопка",
                    Style:    discordgo.PrimaryButton,
                    CustomID: "button_1",
                },
            },
        },
    },
})

📌 Структура такая:

Message
 └── Components
      └── ActionsRow
           └── Button / Select

6. Открытие соединения

dg.Open()

➡️ Бот подключается к Gateway (WebSocket)
и начинает получать события


7. Регистрация slash-команд (если есть)

В примере обычно есть:

dg.ApplicationCommandCreate(AppID, GuildID, &discordgo.ApplicationCommand{
    Name: "components",
})

➡️ Это команда типа:

/components

Она отправляет сообщение с кнопками


8. Ожидание завершения

fmt.Println("Bot is running. Press CTRL-C to exit.")
<-stop

➡️ Просто блокирует программу


Краткая схема

Запуск бота
   ↓
Создание Session
   ↓
Регистрация handler-ов
   ↓
Отправка сообщения с кнопками
   ↓
Пользователь нажимает кнопку
   ↓
InteractionCreate событие
   ↓
handler проверяет CustomID
   ↓
бот отвечает

Важные идеи, которые нужно понять

1. Всё событийное

Ты не "читаешь сообщения" — ты реагируешь на события


2. CustomID — ключ логики

Это как callback_data в Telegram


3. Components — это просто JSON-структуры

DiscordGo оборачивает их в Go-структуры


Если хочешь дальше

Могу разобрать:

  • каждую строку кода из файла по порядку
  • как добавить свои кнопки/меню
  • как сделать state (например, чтобы кнопки что-то запоминали)