Приветствие пользователя при присоединении в канал
Боты, так же как и пользователи, имеют возможность подключаться к вебсокетам, благодаря чему будет возможность получать различные события от сервера в реальном времени.
Для для начала работы, вам нужно создать новое WebSocket подключение. Вы должны указать URL вебсокета и заголовки с токеном авторизации.
При успешном подключении сразу же придет приветственное событие hello
, которое означает успешное подключение.
Более подробную информацию по работе WebSocket'ов можно найти в API Guide.
Все примеры будут написаны на языке Go. Структура приходящего события евента от сервера будет сокращена для краткости.
type ServerEvent struct {
Event string `json:"event"`
Data map[string]any `json:"data"`
Broadcast struct {
ChannelId string `json:"channel_id"`
TeamId string `json:"team_id"`
} `json:"broadcast"`
}
После подключения к WebSocket'ам мы сразу можем начать читать все приходящие события:
for {
_, message, err := conn.ReadMessage()
if err != nil {
fmt.Println("Error reading message: ", err)
return
}
var event ServerEvent
if err := json.Unmarshal(message, &event); err != nil {
fmt.Println("Error unmarshalling message: ", err)
return
}
fmt.Printf("New event received! ->\nEvent: %s\nChannelID: %s\nEvent Data: %#v\n\n",
event.Event, event.Broadcast.ChannelId, event.Data)
// ...
}
Каждое событие представляет собой действие, которое было произведено на сервере. Например, user_added
означает, что пользователь был добавлен в канал. Что бы отправить приветственное сообщение пользователю, нам надо дождаться события user_added
события, а затем отправить POST
запрос для создания поста.
if event.Event != "user_added" {
continue
}
if err := sendMessage(event.Broadcast.ChannelId, fmt.Sprintf("Hello! UserID: %s", event.Data["user_id"])); err != nil {
fmt.Println("Error creating post: ", err)
return
}
Теперь, если пользователя добавят в канал - в чат напишет приветственное сообщение и добавить UserID
добавленного пользователя
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
"github.com/gorilla/websocket"
)
const (
V4_POSTS_URL = "<POSTS API URL>"
WEBSOCKET_URL = "<WEBSOCKETS URL>"
)
var AUTH_TOKEN = "Bearer " + os.Getenv("TOKEN")
type ServerEvent struct {
Event string `json:"event"`
Data map[string]interface{} `json:"data"`
Broadcast struct {
ChannelId string `json:"channel_id"`
TeamId string `json:"team_id"`
} `json:"broadcast"`
}
func sendMessage(peer, message string) error {
payload, _ := json.Marshal(map[string]any{
"peer": peer,
"message": message,
})
req, _ := http.NewRequest(http.MethodPost, V4_POSTS_URL, bytes.NewReader(payload))
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", AUTH_TOKEN)
res, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer res.Body.Close()
return nil
}
func main() {
header := http.Header{}
header.Add("Authorization", AUTH_TOKEN)
conn, _, err := websocket.DefaultDialer.Dial(WEBSOCKET_URL, header)
if err != nil {
fmt.Println("Error connecting to websocket: ", err)
return
}
defer conn.Close()
for {
_, message, err := conn.ReadMessage()
if err != nil {
fmt.Println("Error reading message: ", err)
return
}
var event ServerEvent
if err := json.Unmarshal(message, &event); err != nil {
fmt.Println("Error unmarshalling message: ", err)
return
}
fmt.Printf("New event received! ->\nEvent: %s\nChannelID: %s\nEvent Data: %#v\n\n",
event.Event, event.Broadcast.ChannelId, event.Data)
if event.Event != "user_added" {
continue
}
if err := sendMessage(event.Broadcast.ChannelId, fmt.Sprintf("Hello! UserID: %s", event.Data["user_id"])); err != nil {
fmt.Println("Error creating post: ", err)
return
}
}
}