mirror of
https://github.com/retailcrm/mg-bot-api-client-go.git
synced 2024-11-22 04:46:05 +03:00
Add websocket example
This commit is contained in:
parent
f7c6a1e9c3
commit
fa605d5f07
58
README.md
58
README.md
@ -40,3 +40,61 @@ func main() {
|
|||||||
fmt.Printf("%v", data.MessageID)
|
fmt.Printf("%v", data.MessageID)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Websocket Example
|
||||||
|
|
||||||
|
```golang
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/gorilla/websocket"
|
||||||
|
"github.com/retailcrm/mg-bot-api-client-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var client = v1.New("https://token.url", "cb8ccf05e38a47543ad8477d49bcba99be73bff503ea6")
|
||||||
|
|
||||||
|
url, headers, err := client.WsMeta([]string{"message_new"})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("wsMeta:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
wsConn, _, err := websocket.DefaultDialer.Dial(url, headers)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("dial:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
var wsEvent v1.WsEvent
|
||||||
|
err = wsConn.ReadJSON(&wsEvent)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("ReadJSON:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var eventData v1.WsEventMessageNewData
|
||||||
|
err = json.Unmarshal(wsEvent.Data, &eventData)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unmarshal:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasPrefix(eventData.Message.Content, "Hello") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
message := v1.MessageSendRequest{
|
||||||
|
Scope: "public",
|
||||||
|
Content: "Bonjour!",
|
||||||
|
ChatID: eventData.Message.ChatID,
|
||||||
|
}
|
||||||
|
|
||||||
|
_, status, err := client.MessageSend(message)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("%d %v", status, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
@ -669,7 +669,7 @@ func (c *MgClient) WsMeta(events []string) (string, http.Header, error) {
|
|||||||
return url, nil, err
|
return url, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
url = fmt.Sprintf("%s%s%s%s", strings.Replace(c.URL, "https", "ws", 1), prefix, "/ws?events=", strings.Join(events[:], ","))
|
url = fmt.Sprintf("%s%s%s%s", strings.Replace(c.URL, "https", "wss", 1), prefix, "/ws?events=", strings.Join(events[:], ","))
|
||||||
|
|
||||||
if url == "" {
|
if url == "" {
|
||||||
err := errors.New("empty WS URL")
|
err := errors.New("empty WS URL")
|
||||||
|
@ -326,7 +326,7 @@ func TestMgClient_WsMeta(t *testing.T) {
|
|||||||
t.Errorf("%v", err)
|
t.Errorf("%v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
resUrl := fmt.Sprintf("%s%s%s%s", strings.Replace(c.URL, "https", "ws", 1), prefix, "/ws?events=", strings.Join(events[:], ","))
|
resUrl := fmt.Sprintf("%s%s%s%s", strings.Replace(c.URL, "https", "wss", 1), prefix, "/ws?events=", strings.Join(events[:], ","))
|
||||||
resToken := c.Token
|
resToken := c.Token
|
||||||
|
|
||||||
assert.Equal(t, resUrl, url)
|
assert.Equal(t, resUrl, url)
|
||||||
|
91
v1/types.go
91
v1/types.go
@ -1,6 +1,7 @@
|
|||||||
package v1
|
package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -285,10 +286,10 @@ type (
|
|||||||
// WS event types
|
// WS event types
|
||||||
type (
|
type (
|
||||||
WsEvent struct {
|
WsEvent struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Meta EventMeta `json:"meta"`
|
Meta EventMeta `json:"meta"`
|
||||||
AppID uint `json:"app_id"`
|
AppID uint `json:"app_id"`
|
||||||
Data interface{} `json:"data"`
|
Data json.RawMessage `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
EventMeta struct {
|
EventMeta struct {
|
||||||
@ -370,6 +371,33 @@ type (
|
|||||||
CreatedAt string
|
CreatedAt string
|
||||||
UpdatedAt string
|
UpdatedAt string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Chat struct {
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
Avatar string `json:"avatar"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Channel *Channel `json:"channel,omitempty"`
|
||||||
|
Members []Member `json:"members"`
|
||||||
|
Customer *UserRef `json:"customer"`
|
||||||
|
AuthorID uint64 `json:"author_id"`
|
||||||
|
LastMessage *Message `json:"last_message"`
|
||||||
|
LastActivity string `json:"last_activity"`
|
||||||
|
}
|
||||||
|
|
||||||
|
Member struct {
|
||||||
|
IsAuthor bool `json:"is_author"`
|
||||||
|
State string `json:"state"`
|
||||||
|
User *UserRef `json:"user"`
|
||||||
|
}
|
||||||
|
|
||||||
|
Dialog struct {
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
BeginMessageID *uint64 `json:"begin_message_id"`
|
||||||
|
EndingMessageID *uint64 `json:"ending_message_id"`
|
||||||
|
Chat *Chat `json:"chat"`
|
||||||
|
CreatedAt string `json:"created_at"`
|
||||||
|
ClosedAt *string `json:"closed_at"`
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Channel settings
|
// Channel settings
|
||||||
@ -392,3 +420,58 @@ type (
|
|||||||
Text ChannelSettingsText `json:"text"`
|
Text ChannelSettingsText `json:"text"`
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Events
|
||||||
|
type (
|
||||||
|
WsEventMessageNewData struct {
|
||||||
|
Message *Message `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
WsEventMessageUpdatedData struct {
|
||||||
|
Message *Message `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
WsEventMessageDeletedData struct {
|
||||||
|
Message *Message `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
WsEventChatCreatedData struct {
|
||||||
|
Chat *Chat `json:"chat"`
|
||||||
|
}
|
||||||
|
|
||||||
|
WsEventChatUpdatedData struct {
|
||||||
|
Chat *Chat `json:"chat"`
|
||||||
|
}
|
||||||
|
|
||||||
|
WsEventDialogOpenedData struct {
|
||||||
|
Dialog *Dialog `json:"dialog"`
|
||||||
|
}
|
||||||
|
|
||||||
|
WsEventDialogClosedData struct {
|
||||||
|
Dialog *Dialog `json:"dialog"`
|
||||||
|
}
|
||||||
|
|
||||||
|
WsEventUserLeaveData struct {
|
||||||
|
Reason string `json:"reason"`
|
||||||
|
Chat struct {
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
} `json:"chat"`
|
||||||
|
User struct {
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
} `json:"user"`
|
||||||
|
}
|
||||||
|
|
||||||
|
WsEventUserUpdatedData struct {
|
||||||
|
*UserRef
|
||||||
|
}
|
||||||
|
|
||||||
|
WsEventDialogAssignData struct {
|
||||||
|
Dialog *Dialog `json:"dialog"`
|
||||||
|
Chat *Chat `json:"chat"`
|
||||||
|
}
|
||||||
|
|
||||||
|
EventUserJoinedChatData struct {
|
||||||
|
Chat *Chat `json:"chat"`
|
||||||
|
User *UserRef `json:"user"`
|
||||||
|
}
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user