Перейти к основному содержимому

Приветствие пользователя при присоединении в канал

Боты, так же как и пользователи, имеют возможность подключаться к вебсокетам, благодаря чему будет возможность получать различные события от сервера в реальном времени.

Для для начала работы, вам нужно создать новое 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
}
}
}