From 7ebadf753ee6c5bb7be875c857157a7eb7a38f92 Mon Sep 17 00:00:00 2001 From: Alex Lushpai Date: Mon, 28 May 2018 18:08:15 +0300 Subject: [PATCH] make route for MG webhook --- event.go | 9 +++++++ repository.go | 11 ++++++++ routing.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ telegram.go | 1 + 4 files changed, 96 insertions(+) create mode 100644 event.go diff --git a/event.go b/event.go new file mode 100644 index 0000000..e4c4d24 --- /dev/null +++ b/event.go @@ -0,0 +1,9 @@ +package main + +type EventMessage struct { + ChannelID uint64 `json:"channel_id"` + ExternalID int `json:"external_id,omitempty"` + ChatID int64 `json:"chat_id"` + Message string `json:"message,omitempty"` + Type string `json:"type"` +} diff --git a/repository.go b/repository.go index 96d77d8..2da630c 100644 --- a/repository.go +++ b/repository.go @@ -37,6 +37,17 @@ func getBotByToken(token string) *Bot { return &bot } +func getBotByChannel(ch uint64) *Bot { + var bot Bot + orm.DB.First(&bot, "channel = ?", ch) + + return &bot +} + +func (b *Bot) createBot() error { + return orm.DB.Create(b).Error +} + func (b *Bot) setBotActivity() error { return orm.DB.Model(b).Where("token = ?", b.Token).Update("Active", !b.Active).Error } diff --git a/routing.go b/routing.go index 06b3900..cff5230 100644 --- a/routing.go +++ b/routing.go @@ -557,6 +557,81 @@ func validateCrmSettings(c Connection) error { return nil } +func mgWebhookHandler(w http.ResponseWriter, r *http.Request) { + bytes, err := ioutil.ReadAll(r.Body) + if err != nil { + raven.CaptureErrorAndWait(err, nil) + logger.Error(err) + return + } + + var msg EventMessage + err = json.Unmarshal(bytes, &msg) + if err != nil { + raven.CaptureErrorAndWait(err, nil) + logger.Error(err) + return + } + + b := getBotByChannel(msg.ChannelID) + if b.ID == 0 { + logger.Error(msg.ChannelID, "missing") + return + } + + if !b.Active { + logger.Error(msg.ChannelID, "deactivated") + return + } + + bot, err := tgbotapi.NewBotAPI(b.Token) + if err != nil { + raven.CaptureErrorAndWait(err, nil) + logger.Error(err) + } + + bot.Debug = true + + if msg.Type == "message_sent" { + msg, err := bot.Send(tgbotapi.NewMessage(msg.ChatID, msg.Message)) + if err != nil { + logger.Error(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + logger.Debugf("%v", msg) + w.WriteHeader(http.StatusOK) + w.Write([]byte("Message sent")) + } + + if msg.Type == "message_updated" { + msg, err := bot.Send(tgbotapi.NewEditMessageText(msg.ChatID, msg.ExternalID, msg.Message)) + if err != nil { + logger.Error(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + logger.Debugf("%v", msg) + w.WriteHeader(http.StatusOK) + w.Write([]byte("Message updated")) + } + + if msg.Type == "message_deleted" { + msg, err := bot.Send(tgbotapi.NewDeleteMessage(msg.ChatID, msg.ExternalID)) + if err != nil { + logger.Error(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + logger.Debugf("%v", msg) + w.WriteHeader(http.StatusOK) + w.Write([]byte("Message deleted")) + } +} + func getAPIClient(url, key string) (*v5.Client, error, int) { client := v5.New(url, key) diff --git a/telegram.go b/telegram.go index a00fe9a..aa62cc7 100644 --- a/telegram.go +++ b/telegram.go @@ -15,6 +15,7 @@ import ( func setTransportRoutes() { http.HandleFunc("/telegram/", makeHandler(telegramWebhookHandler)) + http.HandleFunc("/webhook/", mgWebhookHandler) } // GetBotInfo function