From 8343a606ffdea4841e9ae9cc57f333bd89bb28e4 Mon Sep 17 00:00:00 2001 From: DmitryZagorulko Date: Thu, 13 Sep 2018 16:32:50 +0300 Subject: [PATCH 1/3] add product transfer --- go.mod | 2 +- go.sum | 4 +- src/main.go | 12 ++--- src/routing.go | 98 ++++++++++++++++++++++++++------------ src/utils.go | 2 +- translate/translate.en.yml | 2 + translate/translate.es.yml | 2 + translate/translate.ru.yml | 2 + 8 files changed, 83 insertions(+), 41 deletions(-) diff --git a/go.mod b/go.mod index dd05dcf..93957f4 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/pkg/errors v0.8.0 github.com/pmezard/go-difflib v1.0.0 // indirect github.com/retailcrm/api-client-go v1.0.6 - github.com/retailcrm/mg-transport-api-client-go v1.1.5 + github.com/retailcrm/mg-transport-api-client-go v1.1.6 github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf // indirect github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a // indirect github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 // indirect diff --git a/go.sum b/go.sum index 09103e9..a9e6dea 100644 --- a/go.sum +++ b/go.sum @@ -93,8 +93,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/retailcrm/api-client-go v1.0.6 h1:4Q3e4ve8GOOHIQdq3/wTGqgWuWa1cKMKqmgrTv4FoDU= github.com/retailcrm/api-client-go v1.0.6/go.mod h1:QRoPE2SM6ST7i2g0yEdqm7Iw98y7cYuq3q14Ot+6N8c= -github.com/retailcrm/mg-transport-api-client-go v1.1.5 h1:UCotZ5ONR/jvRf+QqjId6GPgByX1N5FvhPGHhTCAIvg= -github.com/retailcrm/mg-transport-api-client-go v1.1.5/go.mod h1:AWV6BueE28/6SCoyfKURTo4lF0oXYoOKmHTzehd5vAI= +github.com/retailcrm/mg-transport-api-client-go v1.1.6 h1:bwBs+iJbJzTAUFbkz+LmOhpruYebrI26haPPzBlZaRU= +github.com/retailcrm/mg-transport-api-client-go v1.1.6/go.mod h1:AWV6BueE28/6SCoyfKURTo4lF0oXYoOKmHTzehd5vAI= github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf h1:6V1qxN6Usn4jy8unvggSJz/NC790tefw8Zdy6OZS5co= github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a h1:JSvGDIbmil4Ui/dDdFBExb7/cmkNjyX5F97oglmvCDo= diff --git a/src/main.go b/src/main.go index fdc0960..fea1963 100644 --- a/src/main.go +++ b/src/main.go @@ -15,12 +15,12 @@ type Options struct { } var ( - config *TransportConfig - orm *Orm - logger *logging.Logger - options Options - parser = flags.NewParser(&options, flags.Default) - rx = regexp.MustCompile(`/+$`) + config *TransportConfig + orm *Orm + logger *logging.Logger + options Options + parser = flags.NewParser(&options, flags.Default) + rx = regexp.MustCompile(`/+$`) ) func main() { diff --git a/src/routing.go b/src/routing.go index 91527cd..2032dec 100644 --- a/src/routing.go +++ b/src/routing.go @@ -3,6 +3,7 @@ package main import ( "encoding/json" "fmt" + "github.com/nicksnyder/go-i18n/v2/i18n" "net/http" "strconv" "time" @@ -484,7 +485,72 @@ func mgWebhookHandler(c *gin.Context) { return } - if msg.Type == "message_sent" { + switch msg.Type { + case "message_sent": + m := tgbotapi.NewMessage(cid, msg.Data.Content) + + if msg.Data.QuoteExternalID != "" { + qid, err := strconv.Atoi(msg.Data.QuoteExternalID) + if err != nil { + c.Error(err) + return + } + m.ReplyToMessageID = qid + } + + msgSend, err := bot.Send(m) + if err != nil { + logger.Error(err) + c.AbortWithStatus(http.StatusBadRequest) + return + } + + if config.Debug { + logger.Debugf("mgWebhookHandler sent %v", msgSend) + } + + c.JSON(http.StatusOK, gin.H{"external_message_id": strconv.Itoa(msgSend.MessageID)}) + + case "message_updated": + msgSend, err := bot.Send(tgbotapi.NewEditMessageText(cid, uid, msg.Data.Content)) + if err != nil { + logger.Error(err) + c.AbortWithStatus(http.StatusBadRequest) + return + } + + if config.Debug { + logger.Debugf("mgWebhookHandler update %v", msgSend) + } + + c.AbortWithStatus(http.StatusOK) + + case "message_deleted": + msgSend, err := bot.Send(tgbotapi.NewDeleteMessage(cid, uid)) + if err != nil { + logger.Error(err) + c.AbortWithStatus(http.StatusBadRequest) + return + } + + if config.Debug { + logger.Debugf("mgWebhookHandler delete %v", msgSend) + } + + c.JSON(http.StatusOK, gin.H{}) + case "product": + mb := msg.Data.Product.Url + mb += "\n" + msg.Data.Product.Name + + if msg.Data.Product.Cost != nil && msg.Data.Product.Cost.Value != 0 { + mb += "\n" + localizer.MustLocalize(&i18n.LocalizeConfig{ + MessageID: "missing_credentials", + TemplateData: map[string]interface{}{ + "Value": msg.Data.Product.Cost.Value, + "Currency": msg.Data.Product.Cost.Currency, + }, + }) + } m := tgbotapi.NewMessage(cid, msg.Data.Content) if msg.Data.QuoteExternalID != "" { @@ -509,34 +575,4 @@ func mgWebhookHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"external_message_id": strconv.Itoa(msgSend.MessageID)}) } - - if msg.Type == "message_updated" { - msgSend, err := bot.Send(tgbotapi.NewEditMessageText(cid, uid, msg.Data.Content)) - if err != nil { - logger.Error(err) - c.AbortWithStatus(http.StatusBadRequest) - return - } - - if config.Debug { - logger.Debugf("mgWebhookHandler update %v", msgSend) - } - - c.AbortWithStatus(http.StatusOK) - } - - if msg.Type == "message_deleted" { - msgSend, err := bot.Send(tgbotapi.NewDeleteMessage(cid, uid)) - if err != nil { - logger.Error(err) - c.AbortWithStatus(http.StatusBadRequest) - return - } - - if config.Debug { - logger.Debugf("mgWebhookHandler delete %v", msgSend) - } - - c.JSON(http.StatusOK, gin.H{}) - } } diff --git a/src/utils.go b/src/utils.go index fe0e859..9da0790 100644 --- a/src/utils.go +++ b/src/utils.go @@ -18,7 +18,7 @@ import ( ) var ( - tokenCounter uint32 + tokenCounter uint32 credentialsTransport = []string{ "/api/integration-modules/{code}", "/api/integration-modules/{code}/edit", diff --git a/translate/translate.en.yml b/translate/translate.en.yml index baf1d51..40756a9 100644 --- a/translate/translate.en.yml +++ b/translate/translate.en.yml @@ -41,3 +41,5 @@ video: "[video]" voice: "[voice message]" photo: "[photo]" undefined: "[undefined format of a message]" + +cost: "Cost: {{.Value}} {{.Currency}}" diff --git a/translate/translate.es.yml b/translate/translate.es.yml index 3641cc4..32c6752 100644 --- a/translate/translate.es.yml +++ b/translate/translate.es.yml @@ -41,3 +41,5 @@ video: "[video]" voice: "[mensaje de voz]" photo: "[foto]" other: "[formato indefinido de mensaje]" + +cost: "Costo: {{.Value}} {{.Currency}}" diff --git a/translate/translate.ru.yml b/translate/translate.ru.yml index 523fe6d..7c68e01 100644 --- a/translate/translate.ru.yml +++ b/translate/translate.ru.yml @@ -41,3 +41,5 @@ video: "[видео]" voice: "[голосовое сообщение]" photo: "[изображение]" undefined: "[неопределенный формат сообщения]" + +cost: "Цена: {{.Value}} {{.Currency}}" From 4ffebf56fb9157221761ad946f509936100f57ad Mon Sep 17 00:00:00 2001 From: DmitryZagorulko Date: Thu, 13 Sep 2018 17:25:06 +0300 Subject: [PATCH 2/3] improve product transfer --- go.mod | 2 +- go.sum | 2 ++ src/routing.go | 57 +++++++++++++------------------------- translate/translate.en.yml | 2 -- translate/translate.es.yml | 2 -- translate/translate.ru.yml | 2 -- 6 files changed, 23 insertions(+), 44 deletions(-) diff --git a/go.mod b/go.mod index 93957f4..3bd0423 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/pkg/errors v0.8.0 github.com/pmezard/go-difflib v1.0.0 // indirect github.com/retailcrm/api-client-go v1.0.6 - github.com/retailcrm/mg-transport-api-client-go v1.1.6 + github.com/retailcrm/mg-transport-api-client-go v1.1.7 github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf // indirect github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a // indirect github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 // indirect diff --git a/go.sum b/go.sum index a9e6dea..23418e6 100644 --- a/go.sum +++ b/go.sum @@ -95,6 +95,8 @@ github.com/retailcrm/api-client-go v1.0.6 h1:4Q3e4ve8GOOHIQdq3/wTGqgWuWa1cKMKqmg github.com/retailcrm/api-client-go v1.0.6/go.mod h1:QRoPE2SM6ST7i2g0yEdqm7Iw98y7cYuq3q14Ot+6N8c= github.com/retailcrm/mg-transport-api-client-go v1.1.6 h1:bwBs+iJbJzTAUFbkz+LmOhpruYebrI26haPPzBlZaRU= github.com/retailcrm/mg-transport-api-client-go v1.1.6/go.mod h1:AWV6BueE28/6SCoyfKURTo4lF0oXYoOKmHTzehd5vAI= +github.com/retailcrm/mg-transport-api-client-go v1.1.7 h1:dKm2hhR6l1kQvYKjD50C4/W9EzfV6t6YVdhLxSExooU= +github.com/retailcrm/mg-transport-api-client-go v1.1.7/go.mod h1:AWV6BueE28/6SCoyfKURTo4lF0oXYoOKmHTzehd5vAI= github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf h1:6V1qxN6Usn4jy8unvggSJz/NC790tefw8Zdy6OZS5co= github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a h1:JSvGDIbmil4Ui/dDdFBExb7/cmkNjyX5F97oglmvCDo= diff --git a/src/routing.go b/src/routing.go index 2032dec..f22fdbd 100644 --- a/src/routing.go +++ b/src/routing.go @@ -3,7 +3,6 @@ package main import ( "encoding/json" "fmt" - "github.com/nicksnyder/go-i18n/v2/i18n" "net/http" "strconv" "time" @@ -487,7 +486,26 @@ func mgWebhookHandler(c *gin.Context) { switch msg.Type { case "message_sent": - m := tgbotapi.NewMessage(cid, msg.Data.Content) + var mb string + if msg.Data.Type == v1.MsgTypeProduct { + mb = msg.Data.Product.Name + if msg.Data.Product.Cost != nil && msg.Data.Product.Cost.Value != 0 { + mb += fmt.Sprintf( + "\n%v %s", + msg.Data.Product.Cost.Value, + msg.Data.Product.Cost.Currency, + ) + } + + if msg.Data.Product.Img != "" { + mb = fmt.Sprintf("\n%s", msg.Data.Product.Img) + } + + } else { + mb = msg.Data.Content + } + + m := tgbotapi.NewMessage(cid, mb) if msg.Data.QuoteExternalID != "" { qid, err := strconv.Atoi(msg.Data.QuoteExternalID) @@ -538,41 +556,6 @@ func mgWebhookHandler(c *gin.Context) { } c.JSON(http.StatusOK, gin.H{}) - case "product": - mb := msg.Data.Product.Url - mb += "\n" + msg.Data.Product.Name - if msg.Data.Product.Cost != nil && msg.Data.Product.Cost.Value != 0 { - mb += "\n" + localizer.MustLocalize(&i18n.LocalizeConfig{ - MessageID: "missing_credentials", - TemplateData: map[string]interface{}{ - "Value": msg.Data.Product.Cost.Value, - "Currency": msg.Data.Product.Cost.Currency, - }, - }) - } - m := tgbotapi.NewMessage(cid, msg.Data.Content) - - if msg.Data.QuoteExternalID != "" { - qid, err := strconv.Atoi(msg.Data.QuoteExternalID) - if err != nil { - c.Error(err) - return - } - m.ReplyToMessageID = qid - } - - msgSend, err := bot.Send(m) - if err != nil { - logger.Error(err) - c.AbortWithStatus(http.StatusBadRequest) - return - } - - if config.Debug { - logger.Debugf("mgWebhookHandler sent %v", msgSend) - } - - c.JSON(http.StatusOK, gin.H{"external_message_id": strconv.Itoa(msgSend.MessageID)}) } } diff --git a/translate/translate.en.yml b/translate/translate.en.yml index 40756a9..baf1d51 100644 --- a/translate/translate.en.yml +++ b/translate/translate.en.yml @@ -41,5 +41,3 @@ video: "[video]" voice: "[voice message]" photo: "[photo]" undefined: "[undefined format of a message]" - -cost: "Cost: {{.Value}} {{.Currency}}" diff --git a/translate/translate.es.yml b/translate/translate.es.yml index 32c6752..3641cc4 100644 --- a/translate/translate.es.yml +++ b/translate/translate.es.yml @@ -41,5 +41,3 @@ video: "[video]" voice: "[mensaje de voz]" photo: "[foto]" other: "[formato indefinido de mensaje]" - -cost: "Costo: {{.Value}} {{.Currency}}" diff --git a/translate/translate.ru.yml b/translate/translate.ru.yml index 7c68e01..523fe6d 100644 --- a/translate/translate.ru.yml +++ b/translate/translate.ru.yml @@ -41,5 +41,3 @@ video: "[видео]" voice: "[голосовое сообщение]" photo: "[изображение]" undefined: "[неопределенный формат сообщения]" - -cost: "Цена: {{.Value}} {{.Currency}}" From 883d606edc66b077238e7723950838b64631d82f Mon Sep 17 00:00:00 2001 From: DmitryZagorulko Date: Thu, 13 Sep 2018 21:17:23 +0300 Subject: [PATCH 3/3] add feature, parse mod for product --- go.mod | 2 +- go.sum | 2 ++ src/main.go | 8 ++++++++ src/routing.go | 16 ++++++++++++++-- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3bd0423..156135f 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/pkg/errors v0.8.0 github.com/pmezard/go-difflib v1.0.0 // indirect github.com/retailcrm/api-client-go v1.0.6 - github.com/retailcrm/mg-transport-api-client-go v1.1.7 + github.com/retailcrm/mg-transport-api-client-go v1.1.8 github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf // indirect github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a // indirect github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 // indirect diff --git a/go.sum b/go.sum index 23418e6..895fa84 100644 --- a/go.sum +++ b/go.sum @@ -97,6 +97,8 @@ github.com/retailcrm/mg-transport-api-client-go v1.1.6 h1:bwBs+iJbJzTAUFbkz+LmOh github.com/retailcrm/mg-transport-api-client-go v1.1.6/go.mod h1:AWV6BueE28/6SCoyfKURTo4lF0oXYoOKmHTzehd5vAI= github.com/retailcrm/mg-transport-api-client-go v1.1.7 h1:dKm2hhR6l1kQvYKjD50C4/W9EzfV6t6YVdhLxSExooU= github.com/retailcrm/mg-transport-api-client-go v1.1.7/go.mod h1:AWV6BueE28/6SCoyfKURTo4lF0oXYoOKmHTzehd5vAI= +github.com/retailcrm/mg-transport-api-client-go v1.1.8 h1:xLfy9j0VrAoAQUUtB5LllIqPFDvJ9H1xuri34kfZPPY= +github.com/retailcrm/mg-transport-api-client-go v1.1.8/go.mod h1:AWV6BueE28/6SCoyfKURTo4lF0oXYoOKmHTzehd5vAI= github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf h1:6V1qxN6Usn4jy8unvggSJz/NC790tefw8Zdy6OZS5co= github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a h1:JSvGDIbmil4Ui/dDdFBExb7/cmkNjyX5F97oglmvCDo= diff --git a/src/main.go b/src/main.go index fea1963..b003e90 100644 --- a/src/main.go +++ b/src/main.go @@ -21,6 +21,14 @@ var ( options Options parser = flags.NewParser(&options, flags.Default) rx = regexp.MustCompile(`/+$`) + currency = map[string]string{ + "rub": "₽", + "uah": "₴", + "byr": "Br", + "kzt": "₸", + "usd": "$", + "eur": "€", + } ) func main() { diff --git a/src/routing.go b/src/routing.go index f22fdbd..29d0eef 100644 --- a/src/routing.go +++ b/src/routing.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" "strconv" + "strings" "time" "github.com/gin-gonic/gin" @@ -72,6 +73,10 @@ func addBotHandler(c *gin.Context) { Quoting: v1.ChannelFeatureBoth, Deleting: v1.ChannelFeatureReceive, }, + Product: v1.Product{ + Creating: v1.ChannelFeatureReceive, + Editing: v1.ChannelFeatureReceive, + }, }, } @@ -488,12 +493,16 @@ func mgWebhookHandler(c *gin.Context) { case "message_sent": var mb string if msg.Data.Type == v1.MsgTypeProduct { - mb = msg.Data.Product.Name + mb = fmt.Sprintf( + "[%s](%s)", + msg.Data.Product.Name, + msg.Data.Product.Url, + ) if msg.Data.Product.Cost != nil && msg.Data.Product.Cost.Value != 0 { mb += fmt.Sprintf( "\n%v %s", msg.Data.Product.Cost.Value, - msg.Data.Product.Cost.Currency, + currency[strings.ToLower(msg.Data.Product.Cost.Currency)], ) } @@ -506,6 +515,9 @@ func mgWebhookHandler(c *gin.Context) { } m := tgbotapi.NewMessage(cid, mb) + if msg.Data.Type == v1.MsgTypeProduct { + m.ParseMode = "Markdown" + } if msg.Data.QuoteExternalID != "" { qid, err := strconv.Atoi(msg.Data.QuoteExternalID)