This repository was archived by the owner on May 14, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconn.go
More file actions
107 lines (101 loc) · 3.59 KB
/
conn.go
File metadata and controls
107 lines (101 loc) · 3.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package main
import (
"github.com/Connector73/mx-http-proxy/mx"
"github.com/mdigger/log"
"github.com/mdigger/sse"
)
// Conn описывает соединение с сервером MX.
type Conn struct {
*mx.Conn // соединение с сервером MX
login mx.Login // информация для авторизации
sse *sse.Server // брокер для отсылки событий
}
// Connect подключается к серверу MX и авторизует пользователя.
func Connect(host string, login *mx.Login) (*Conn, error) {
conn, err := mx.Connect(host, login) // устанавливаем соединение и авторизуемся
if err != nil {
return nil, err
}
var mxconn = &Conn{
Conn: conn,
login: *login, // копируем данные о логине
sse: new(sse.Server), // инициализируем брокера для отправики событий
}
go mxconn.reading() // запускаем обработчик входящих событий от сервера MX
return mxconn, nil
}
// Close закрывает соедиение с сервером MX.
func (c *Conn) Close() error {
c.sse.Event("", "close", nil) // отправляем уведомление о закрытии соединения
return c.Conn.Close() // закрываем соединение
}
// reading ожидает события от сервера MX и передает их в виде Server-Sent Events
func (c *Conn) reading() {
// получаем событие
for event := range c.Events() {
var name = event.Name
// выбираем формат описания события в зависимости от его имени
var obj interface{}
switch name {
case "CSTAErrorCode":
obj = new(mx.CSTAError)
case "Logout":
obj = new(mx.ErrLogout)
case "presence":
obj = new(StatusMessageEvent)
case "message":
obj = &ServerMessageEvent{New: true}
case "messageHist":
obj = &ServerMessageEvent{New: false}
// TODO: messageHistChunks
// case "messageHistChunks":
// obj = new(ServerMessageHistoryEvent)
case "DivertedEvent":
obj = new(DivertedEvent)
case "DeliveredEvent":
obj = new(DeliveredEvent)
case "EstablishedEvent":
obj = new(EstablishedEvent)
case "HeldEvent":
obj = new(HeldEvent)
case "RecordingStateEvent":
obj = new(RecordingStateEvent)
case "ServiceInitiatedEvent":
obj = new(ServiceInitiatedEvent)
case "ConnectionClearedEvent":
obj = new(ConnectionClearedEvent)
case "OriginatedEvent":
obj = new(OriginatedEvent)
case "NetworkReachedEvent":
obj = new(NetworkReachedEvent)
case "FailedEvent":
obj = new(FailedEvent)
case "RetrievedEvent":
obj = new(RetrievedEvent)
case "TransferedEvent", "TransferredEvent":
obj = new(TransferredEvent)
name = "TransferredEvent" // исправляем ошибку в написании
case "callParkInfo":
obj = new(ParkedEvent)
case "callloginfo":
obj = new(CallLoginfo)
case "ablist": // игнорируем
continue
default:
log.Warn("unsupported event", "name", name)
continue
}
events.Add(name, 1)
// разбираем XML с описанием события
if err := event.Decode(obj); err != nil {
log.Error("decode event error", err)
continue
}
// отправляем информацию о событии в соответствующий обработчик
c.sse.Event("", name, obj)
log.Debug("sse",
"user", c.login.UserName,
"event", name)
}
c.sse.Close() // закрываем по окончании
}