diff --git a/README.md b/README.md index 369ffc2..3a0d0f0 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ data | дополнительные данные Также могут быть **дополнительные** данные (пишутся в поле "data") в зависимости от используемого метода. -Для метода **vk**: +Для метода **vk** и **tg**: Поле | Описание ------------ | ------------- diff --git a/pkg/chat/chat_factory.go b/pkg/chat/chat_factory.go index 3e8ab51..7a50e9f 100644 --- a/pkg/chat/chat_factory.go +++ b/pkg/chat/chat_factory.go @@ -12,6 +12,8 @@ func NewChat(config *config.ChatConfig) (Chat, error) { switch method { case "vk": cht = &Vk{} + case "tg": + cht = &Tg{} default: return nil, errUnknownMethod(method) } diff --git a/pkg/chat/tg.go b/pkg/chat/tg.go new file mode 100644 index 0000000..044b857 --- /dev/null +++ b/pkg/chat/tg.go @@ -0,0 +1,109 @@ +package chat + +import ( + "fmt" + "github.com/NolikTop/watcher/pkg/server" + "io" + "net/http" + "strconv" +) + +type Tg struct { + name string + + client *http.Client + + chatId int + accessToken string +} + +func (v *Tg) Init(name string, data map[string]interface{}) error { + v.name = name + + if chatId, ok := data["chat_id"]; ok { + v.chatId = int(chatId.(float64)) // сразу в int не дает кастить =((( + } else { + return errNoFieldInData("chat_id") + } + + if accessToken, ok := data["access_token"]; ok { + v.accessToken = accessToken.(string) + } else { + return errNoFieldInData("access_token") + } + + v.client = &http.Client{} + + return nil +} + +func (v *Tg) GetName() string { + return v.name +} + +func (v *Tg) NotifyServerWentDown(server server.Server, err error) error { + message := fmt.Sprintf( + `Сервер %s упал. +Причина: %s +Призываю %s`, + server.GetFormattedName(), err.Error(), server.GetMentionsText(), + ) + + return v.sendMessage(message) +} + +func (v *Tg) NotifyServerStillIsDown(server server.Server) error { + message := fmt.Sprintf( + `Сервер %s все еще лежит. Прошло уже %d сек. +Призываю %s`, + server.GetFormattedName(), server.GetOffTime(), server.GetMentionsText(), + ) + + return v.sendMessage(message) +} + +func (v *Tg) NotifyServerIsUp(server server.Server) error { + message := fmt.Sprintf( + `Сервер %s встал. +Призываю %s`, + server.GetFormattedName(), server.GetMentionsText(), + ) + + return v.sendMessage(message) +} + +func (v *Tg) sendMessage(message string) error { + request, err := http.NewRequest("POST", fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", v.accessToken), nil) + if err != nil { + return err + } + + query := request.URL.Query() + query.Add("chat_id", strconv.Itoa(v.chatId)) + query.Add("text", message) + request.URL.RawQuery = query.Encode() + + response, err := v.client.Do(request) + if err != nil { + return err + } + + defer response.Body.Close() + + body, err := io.ReadAll(response.Body) + if err != nil { + return err + } + + err = v.getErrorFromResponse(body) + if err != nil { + return err + } + + return nil +} + +func (v *Tg) getErrorFromResponse(responseBody []byte) error { + //todo + return nil +} diff --git a/pkg/chat/vk.go b/pkg/chat/vk.go index 396a64e..fc53a89 100644 --- a/pkg/chat/vk.go +++ b/pkg/chat/vk.go @@ -3,7 +3,7 @@ package chat import ( "fmt" "github.com/NolikTop/watcher/pkg/server" - "io/ioutil" + "io" "net/http" "strconv" ) @@ -93,12 +93,12 @@ func (v *Vk) sendMessage(message string) error { defer response.Body.Close() - body, err := ioutil.ReadAll(response.Body) + body, err := io.ReadAll(response.Body) if err != nil { return err } - err = getErrorFromResponse(body) + err = v.getErrorFromResponse(body) if err != nil { return err } @@ -106,7 +106,7 @@ func (v *Vk) sendMessage(message string) error { return nil } -func getErrorFromResponse(responseBody []byte) error { +func (v *Vk) getErrorFromResponse(responseBody []byte) error { //todo return nil }