
Разбор 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 (например, чтобы кнопки что-то запоминали)