-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmx.go
More file actions
75 lines (70 loc) · 3.45 KB
/
Copy pathmx.go
File metadata and controls
75 lines (70 loc) · 3.45 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
package main
import (
"github.com/Sirupsen/logrus"
"github.com/mdigger/mxsms2/csta"
)
// PhoneInfo описывает правила разбора телефонных номеров
type PhoneInfo struct {
Short int `yaml:",omitempty"` // длина короткого телефонного номера
Prefix string `yaml:"defaultPrefix,omitempty"` // префикс неполного телефонного номера
From []string // список исходящих телефонных номеров
}
// MX описывает конфигурацию сервиса, включая необходимые данные для подключения к серверу
// и авторизации пользователя.
type MX struct {
name string // имя сервиса
csta.Addr `yaml:"server"` // адрес сервера
csta.Login // информация для авторизации
PhoneInfo `yaml:"phones"` // информация для разбора телефонных номеров
DefaultJID string `yaml:"defaultJID,omitempty"` // кому доставлять неизвестные
Disabled bool `yaml:",omitempty"` // флаг игнорируемого сервиса
Logger *logrus.Entry `yaml:"-"` // лог для вывода информации о сервисе
handler *MessageHandle // обработчик сообщений чата
client *csta.Client // клиент соединения с MX-сервером
}
// Connect устанавливает соединение и запускает сервис.
func (mx *MX) Connect() error {
if mx.Logger == nil { // инициализируем поддержку лога
mx.Logger = logrus.NewEntry(logrus.StandardLogger())
}
if mx.name != "" { // добавляем имя сервера в лог, если оно определено
mx.Logger = mx.Logger.WithField("mx", mx.name)
}
if mx.Disabled {
mx.Logger.Warning("Ignore disabled")
return nil
}
conn, err := mx.Addr.Dial()
if err != nil {
mx.Logger.WithError(err).Error("MX Connecting error")
return err // возвращаем ошибку установки соединения с сервером
}
mx.Logger.WithField("host", mx.Addr.FullAddr()).Info("MX Connected")
// инициализируем клиента
client := csta.NewClient(conn)
defer client.Close()
client.Logger = mx.Logger
// инициализируем обработчик сообщений
mx.handler = NewMessageHandler(config.SMSGate, mx)
client.AddHandler(mx.handler)
if err := client.Login(mx.Login); err != nil {
mx.Logger.WithError(err).Error("Authorizing error")
return err // ошибка отсылки авторизационной команды на сервер
}
mx.Logger.WithField("login", mx.Login.User).Info("MX Authorized")
mx.client = client
// запускаем процесс чтения ответов от сервера
err = client.Reading()
if err != nil {
mx.Logger.WithError(err).Error("MX error")
}
return err
}
// Close останавливает запущенный сервис.
func (mx *MX) Close() error {
if mx.client == nil {
return nil // клиент подключения к серверу не инициализирован
}
mx.Logger.Info("MX Close")
return mx.client.Close() // останавливаем соединение с сервером
}