diff --git a/migrations/1528538599_app.down.sql b/migrations/1528538599_app.down.sql
index c8e61f9..28e2e47 100644
--- a/migrations/1528538599_app.down.sql
+++ b/migrations/1528538599_app.down.sql
@@ -1 +1 @@
-alter table mg_user rename to user;
\ No newline at end of file
+alter table mg_user rename to users;
diff --git a/migrations/1530177124_app.down.sql b/migrations/1530177124_app.down.sql
new file mode 100644
index 0000000..013d097
--- /dev/null
+++ b/migrations/1530177124_app.down.sql
@@ -0,0 +1 @@
+alter table bot add column active boolean;
\ No newline at end of file
diff --git a/migrations/1530177124_app.up.sql b/migrations/1530177124_app.up.sql
new file mode 100644
index 0000000..9ba8c8c
--- /dev/null
+++ b/migrations/1530177124_app.up.sql
@@ -0,0 +1 @@
+alter table bot drop column active;
\ No newline at end of file
diff --git a/models.go b/models.go
index d0845a1..90497be 100644
--- a/models.go
+++ b/models.go
@@ -25,7 +25,6 @@ type Bot struct {
Name string `gorm:"name type:varchar(40)" json:"name,omitempty"`
CreatedAt time.Time
UpdatedAt time.Time
- Active bool `json:"active,omitempty"`
}
// User model
diff --git a/repository.go b/repository.go
index 99727e6..1c62eed 100644
--- a/repository.go
+++ b/repository.go
@@ -48,8 +48,8 @@ func getBotByToken(token string) (*Bot, error) {
return &bot, nil
}
-func (b *Bot) setBotActivity() error {
- return orm.DB.Model(b).Where("token = ?", b.Token).Update("Active", !b.Active).Error
+func (b *Bot) deleteBot() error {
+ return orm.DB.Delete(b, "token = ?", b.Token).Error
}
func getBotChannelByToken(token string) uint64 {
@@ -69,9 +69,9 @@ func (c Connection) getBotsByClientID() Bots {
return b
}
-func getBotByChannelAndCID(connectionID int, ch uint64) *Bot {
+func getBot(cid int, ch uint64) *Bot {
var bot Bot
- orm.DB.First(&bot, "connection_id = ? AND channel = ?", connectionID, ch)
+ orm.DB.First(&bot, "connection_id = ? AND channel = ?", cid, ch)
return &bot
}
diff --git a/routing.go b/routing.go
index 6bf01e1..6df7272 100644
--- a/routing.go
+++ b/routing.go
@@ -61,7 +61,7 @@ func setWrapperRoutes() {
http.HandleFunc("/create/", createHandler)
http.HandleFunc("/actions/activity", activityHandler)
http.HandleFunc("/add-bot/", addBotHandler)
- http.HandleFunc("/activity-bot/", activityBotHandler)
+ http.HandleFunc("/delete-bot/", deleteBotHandler)
}
func renderTemplate(w http.ResponseWriter, tmpl string, c interface{}) {
@@ -200,7 +200,6 @@ func addBotHandler(w http.ResponseWriter, r *http.Request) {
}
b.Channel = data.ChannelID
- b.Active = true
err = c.createBot(b)
if err != nil {
@@ -222,7 +221,7 @@ func addBotHandler(w http.ResponseWriter, r *http.Request) {
w.Write(jsonString)
}
-func activityBotHandler(w http.ResponseWriter, r *http.Request) {
+func deleteBotHandler(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
setLocale(r.Header.Get("Accept-Language"))
body, err := ioutil.ReadAll(r.Body)
@@ -250,36 +249,16 @@ func activityBotHandler(w http.ResponseWriter, r *http.Request) {
return
}
- ch := v1.Channel{
- ID: getBotChannelByToken(b.Token),
- Type: "telegram",
- Events: []string{
- "message_sent",
- "message_updated",
- "message_deleted",
- "message_read",
- },
- }
-
var client = v1.New(c.MGURL, c.MGToken)
- if b.Active {
- data, status, err := client.DeactivateTransportChannel(ch.ID)
- if status > http.StatusOK {
- http.Error(w, localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "error_deactivating_channel"}), http.StatusBadRequest)
- logger.Error(b.ID, status, err.Error(), data)
- return
- }
- } else {
- data, status, err := client.ActivateTransportChannel(ch)
- if status > http.StatusCreated {
- http.Error(w, localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "error_activating_channel"}), http.StatusBadRequest)
- logger.Error(b.ID, status, err.Error(), data)
- return
- }
+ data, status, err := client.DeactivateTransportChannel(getBotChannelByToken(b.Token))
+ if status > http.StatusOK {
+ http.Error(w, localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "error_deactivating_channel"}), http.StatusBadRequest)
+ logger.Error(b.ID, status, err.Error(), data)
+ return
}
- err = b.setBotActivity()
+ err = b.deleteBot()
if err != nil {
raven.CaptureErrorAndWait(err, nil)
http.Error(w, localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "error_save"}), http.StatusInternalServerError)
@@ -309,15 +288,15 @@ func settingsHandler(w http.ResponseWriter, r *http.Request, uid string) {
p,
bots,
map[string]interface{}{
- "ButtonSave": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "button_save"}),
- "ApiKey": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "api_key"}),
- "TabSettings": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "tab_settings"}),
- "TabBots": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "tab_bots"}),
- "TableName": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "table_name"}),
- "TableToken": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "table_token"}),
- "AddBot": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "add_bot"}),
- "TableActivity": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "table_activity"}),
- "Title": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "title"}),
+ "ButtonSave": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "button_save"}),
+ "ApiKey": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "api_key"}),
+ "TabSettings": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "tab_settings"}),
+ "TabBots": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "tab_bots"}),
+ "TableName": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "table_name"}),
+ "TableToken": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "table_token"}),
+ "AddBot": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "add_bot"}),
+ "TableDelete": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "table_delete"}),
+ "Title": localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "title"}),
},
}
diff --git a/routing_test.go b/routing_test.go
index 7959441..e9076aa 100644
--- a/routing_test.go
+++ b/routing_test.go
@@ -103,7 +103,7 @@ func TestRouting_addBotHandler(t *testing.T) {
assert.Equal(t, "123123:Qwerty", res["token"])
}
-func TestRouting_activityBotHandler(t *testing.T) {
+func TestRouting_deleteBotHandler(t *testing.T) {
defer gock.Off()
gock.New("https://test.retailcrm.pro").
@@ -114,13 +114,13 @@ func TestRouting_activityBotHandler(t *testing.T) {
Reply(200).
BodyString(`{"id": 1}`)
- req, err := http.NewRequest("POST", "/activity-bot/", strings.NewReader(`{"token": "123123:Qwerty", "active": false, "connectionId": 1}`))
+ req, err := http.NewRequest("POST", "/delete-bot/", strings.NewReader(`{"token": "123123:Qwerty", "active": false, "connectionId": 1}`))
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
- handler := http.HandlerFunc(activityBotHandler)
+ handler := http.HandlerFunc(deleteBotHandler)
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusOK, rr.Code,
diff --git a/static/script.js b/static/script.js
index bde8d25..7519274 100644
--- a/static/script.js
+++ b/static/script.js
@@ -39,21 +39,17 @@ $("#add-bot").on("submit", function(e) {
)
});
-$(document).on("click", ".activity-bot", function(e) {
+$(document).on("click", ".delete-bot", function(e) {
let but = $(this);
- send("/activity-bot/",
+ send("/delete-bot/",
{
token: but.attr("data-token"),
- active: (but.attr("data-activity") === 'true'),
connectionId: parseInt($('input[name=connectionId]').val()),
},
function () {
- if (but.attr("data-activity") === 'true') {
- but.find('i').replaceWith('play_arrow ');
- but.attr("data-activity", "false")
- } else {
- but.find('i').replaceWith('pause ');
- but.attr("data-activity", "true")
+ but.parents("tr").remove();
+ if ($("#bots tbody tr").length === 0) {
+ $("#bots").addClass("hide");
}
}
)
@@ -89,9 +85,9 @@ function getBotTemplate(data) {
${bot.name}
${bot.token}
-
- pause
+
+ delete
`;
diff --git a/static/style.css b/static/style.css
index 69bda59..ce9aa32 100644
--- a/static/style.css
+++ b/static/style.css
@@ -16,7 +16,7 @@
margin: 0 auto;
}
-#bots .activity-bot{
+#bots .delete-bot{
float: right;
}
diff --git a/telegram.go b/telegram.go
index 95f9237..b8cdc08 100644
--- a/telegram.go
+++ b/telegram.go
@@ -15,6 +15,7 @@ import (
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/getsentry/raven-go"
"github.com/go-telegram-bot-api/telegram-bot-api"
+ "github.com/nicksnyder/go-i18n/v2/i18n"
"github.com/retailcrm/mg-transport-api-client-go/v1"
)
@@ -38,7 +39,7 @@ func telegramWebhookHandler(w http.ResponseWriter, r *http.Request, token string
return
}
- if b.ID == 0 || !b.Active {
+ if b.ID == 0 {
logger.Error(token, "telegramWebhookHandler: missing or deactivated")
w.WriteHeader(http.StatusOK)
return
@@ -76,112 +77,118 @@ func telegramWebhookHandler(w http.ResponseWriter, r *http.Request, token string
var client = v1.New(c.MGURL, c.MGToken)
if update.Message != nil {
- if update.Message.Text != "" {
- nickname := update.Message.From.UserName
- user := getUserByExternalID(update.Message.From.ID)
+ if update.Message.Text == "" {
+ setLocale(update.Message.From.LanguageCode)
+ update.Message.Text = localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: getMessageID(update.Message)})
+ }
- if update.Message.From.UserName == "" {
- nickname = update.Message.From.FirstName
- }
+ nickname := update.Message.From.UserName
+ user := getUserByExternalID(update.Message.From.ID)
- if user.Expired(config.UpdateInterval) || user.ID == 0 {
- fileID, fileURL, err := GetFileIDAndURL(b.Token, update.Message.From.ID)
- if err != nil {
- raven.CaptureErrorAndWait(err, nil)
- logger.Error(err)
- w.WriteHeader(http.StatusInternalServerError)
- return
- }
+ if update.Message.From.UserName == "" {
+ nickname = update.Message.From.FirstName
+ }
- if fileID != user.UserPhotoID && fileURL != "" {
- picURL, err := UploadUserAvatar(fileURL)
- if err != nil {
- raven.CaptureErrorAndWait(err, nil)
- logger.Error(err)
- w.WriteHeader(http.StatusInternalServerError)
- return
- }
-
- user.UserPhotoID = fileID
- user.UserPhotoURL = picURL
- }
-
- if user.ExternalID == 0 {
- user.ExternalID = update.Message.From.ID
- }
-
- err = user.save()
- if err != nil {
- raven.CaptureErrorAndWait(err, nil)
- logger.Error(err)
- w.WriteHeader(http.StatusInternalServerError)
- return
- }
- }
-
- if config.Debug {
- logger.Debugf("telegramWebhookHandler user %v", user)
- }
-
- snd := v1.SendData{
- Message: v1.SendMessage{
- Message: v1.Message{
- ExternalID: strconv.Itoa(update.Message.MessageID),
- Type: "text",
- Text: update.Message.Text,
- },
- SentAt: time.Now(),
- },
- User: v1.User{
- ExternalID: strconv.Itoa(update.Message.From.ID),
- Nickname: nickname,
- Firstname: update.Message.From.FirstName,
- Avatar: user.UserPhotoURL,
- Lastname: update.Message.From.LastName,
- Language: update.Message.From.LanguageCode,
- },
- Channel: b.Channel,
- ExternalChatID: strconv.FormatInt(update.Message.Chat.ID, 10),
- }
-
- data, st, err := client.Messages(snd)
+ if user.Expired(config.UpdateInterval) || user.ID == 0 {
+ fileID, fileURL, err := GetFileIDAndURL(b.Token, update.Message.From.ID)
if err != nil {
raven.CaptureErrorAndWait(err, nil)
- logger.Error(token, err.Error(), st, data)
+ logger.Error(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
- if config.Debug {
- logger.Debugf("telegramWebhookHandler Type: SendMessage, Bot: %v, Message: %v, Response: %v", b.ID, snd, data)
+ if fileID != user.UserPhotoID && fileURL != "" {
+ picURL, err := UploadUserAvatar(fileURL)
+ if err != nil {
+ raven.CaptureErrorAndWait(err, nil)
+ logger.Error(err)
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ user.UserPhotoID = fileID
+ user.UserPhotoURL = picURL
}
+
+ if user.ExternalID == 0 {
+ user.ExternalID = update.Message.From.ID
+ }
+
+ err = user.save()
+ if err != nil {
+ raven.CaptureErrorAndWait(err, nil)
+ logger.Error(err)
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+ }
+
+ if config.Debug {
+ logger.Debugf("telegramWebhookHandler user %v", user)
+ }
+
+ snd := v1.SendData{
+ Message: v1.SendMessage{
+ Message: v1.Message{
+ ExternalID: strconv.Itoa(update.Message.MessageID),
+ Type: "text",
+ Text: update.Message.Text,
+ },
+ SentAt: time.Now(),
+ },
+ User: v1.User{
+ ExternalID: strconv.Itoa(update.Message.From.ID),
+ Nickname: nickname,
+ Firstname: update.Message.From.FirstName,
+ Avatar: user.UserPhotoURL,
+ Lastname: update.Message.From.LastName,
+ Language: update.Message.From.LanguageCode,
+ },
+ Channel: b.Channel,
+ ExternalChatID: strconv.FormatInt(update.Message.Chat.ID, 10),
+ }
+
+ data, st, err := client.Messages(snd)
+ if err != nil {
+ raven.CaptureErrorAndWait(err, nil)
+ logger.Error(token, err.Error(), st, data)
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ if config.Debug {
+ logger.Debugf("telegramWebhookHandler Type: SendMessage, Bot: %v, Message: %v, Response: %v", b.ID, snd, data)
}
}
if update.EditedMessage != nil {
- if update.EditedMessage.Text != "" {
- snd := v1.UpdateData{
- Message: v1.UpdateMessage{
- Message: v1.Message{
- ExternalID: strconv.Itoa(update.EditedMessage.MessageID),
- Type: "text",
- Text: update.EditedMessage.Text,
- },
+ if update.EditedMessage.Text == "" {
+ setLocale(update.EditedMessage.From.LanguageCode)
+ update.EditedMessage.Text = localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: getMessageID(update.Message)})
+ }
+
+ snd := v1.UpdateData{
+ Message: v1.UpdateMessage{
+ Message: v1.Message{
+ ExternalID: strconv.Itoa(update.EditedMessage.MessageID),
+ Type: "text",
+ Text: update.EditedMessage.Text,
},
- Channel: b.Channel,
- }
+ },
+ Channel: b.Channel,
+ }
- data, st, err := client.UpdateMessages(snd)
- if err != nil {
- raven.CaptureErrorAndWait(err, nil)
- logger.Error(token, err.Error(), st, data)
- w.WriteHeader(http.StatusInternalServerError)
- return
- }
+ data, st, err := client.UpdateMessages(snd)
+ if err != nil {
+ raven.CaptureErrorAndWait(err, nil)
+ logger.Error(token, err.Error(), st, data)
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
- if config.Debug {
- logger.Debugf("telegramWebhookHandler Type: UpdateMessage, Bot: %v, Message: %v, Response: %v", b.ID, snd, data)
- }
+ if config.Debug {
+ logger.Debugf("telegramWebhookHandler Type: UpdateMessage, Bot: %v, Message: %v, Response: %v", b.ID, snd, data)
}
}
@@ -229,8 +236,8 @@ func mgWebhookHandler(w http.ResponseWriter, r *http.Request) {
uid, _ := strconv.Atoi(msg.Data.ExternalMessageID)
cid, _ := strconv.ParseInt(msg.Data.ExternalChatID, 10, 64)
- b := getBotByChannelAndCID(c.ID, msg.Data.ChannelID)
- if b.ID == 0 || !b.Active {
+ b := getBot(c.ID, msg.Data.ChannelID)
+ if b.ID == 0 {
logger.Error(msg.Data.ChannelID, "mgWebhookHandler: missing or deactivated")
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte("missing or deactivated"))
@@ -377,3 +384,26 @@ func UploadUserAvatar(url string) (picURLs3 string, err error) {
return
}
+
+func getMessageID(data *tgbotapi.Message) string {
+ switch {
+ case data.Sticker != nil:
+ return "sticker"
+ case data.Audio != nil:
+ return "audio"
+ case data.Contact != nil:
+ return "contact"
+ case data.Document != nil:
+ return "document"
+ case data.Location != nil:
+ return "location"
+ case data.Video != nil:
+ return "video"
+ case data.Voice != nil:
+ return "voice"
+ case data.Photo != nil:
+ return "photo"
+ default:
+ return "undefined"
+ }
+}
diff --git a/templates/form.html b/templates/form.html
index 058b6a3..ae66278 100644
--- a/templates/form.html
+++ b/templates/form.html
@@ -53,7 +53,7 @@
{{.Locale.TableName}}
{{.Locale.TableToken}}
- {{.Locale.TableActivity}}
+ {{.Locale.TableDelete}}
@@ -62,9 +62,9 @@
{{.Name}}
{{.Token}}
-
- {{if .Active}}pause{{else}}play_arrow{{end}}
+
+ delete
diff --git a/translate/translate.en.yml b/translate/translate.en.yml
index a1d1b5a..ac499d5 100644
--- a/translate/translate.en.yml
+++ b/translate/translate.en.yml
@@ -1,30 +1,40 @@
button_save: Save
-tab_settings: Connection settings
+tab_settings: CRM settings
tab_bots: Bots
-table_name: Bot name
-table_token: Bot token
-table_activity: Activity
-api_key: API Key
-add_bot: Add bot
-title: Telegram transport for retailCRM
-successful: Data successfully updated
+table_name: Name
+table_token: Token
+table_delete: Delete
+api_key: API key
+add_bot: Add a bot
+title: Module of connecting Telegram to retailCRM
+successful: Data was updated successfully
-no_bot_token: Enter the bot token
-wrong_data: Incorrect data
+no_bot_token: Enter a token
+wrong_data: Wrong data
set_method: Set POST method
-bot_already_created: Bot already created
-not_found_account: The account could not be found, contact technical support
-error_activating_channel: Error while activating the channel
-error_deactivating_channel: Error while deactivating the channel
-incorrect_url_key: Enter the correct CRM url or apiKey
-error_creating_integration: Error while creating integration
-error_creating_connection: Error while creating connection
-connection_already_created: Connection already created
-missing_url_key: Missing crm url or apiKey
-incorrect_url: Enter the correct CRM url
-incorrect_token: Set correct bot token
-error_creating_webhook: Error while creating webhook
-error_adding_bot: Error while adding bot
-error_save: An error occurred while saving, contact technical support
-missing_credentials: "Necessary credentials: {{.Credentials}}"
-error_activity_mg: Check the activity with MessageGateway in CRM settings
\ No newline at end of file
+bot_already_created: Bot is already created
+not_found_account: Account is not found, contact technical support
+error_activating_channel: Error when activating a channel
+error_deactivating_channel: Error when deactivating a channel
+incorrect_url_key: Enter the correct URL or API key
+error_creating_integration: Error when integrating
+error_creating_connection: Error when establishing a connection
+connection_already_created: Connection is already established
+missing_url_key: URL and API key are missing
+incorrect_url: Enter the correct URL of CRM
+incorrect_token: Create the correct token
+error_creating_webhook: Error when creating a webhook
+error_adding_bot: Error when adding a bot
+error_save: Error while saving, contact technical support
+missing_credentials: "Required methods: {{.Credentials}}"
+error_activity_mg: Check if the integration with MessageGateway is enabled in CRM settings
+
+sticker: "[sticker]"
+audio: "[audio file]"
+contact: "[contact]"
+document: "[document]"
+location: "[location]"
+video: "[video]"
+voice: "[voice message]"
+photo: "[photo]"
+undefined: "[undefined format of a message]"
diff --git a/translate/translate.ru.yml b/translate/translate.ru.yml
index 4aa4b70..cd44a72 100644
--- a/translate/translate.ru.yml
+++ b/translate/translate.ru.yml
@@ -3,7 +3,7 @@ tab_settings: Настройки CRM
tab_bots: Боты
table_name: Имя
table_token: Токен
-table_activity: Активность
+table_delete: Удалить
api_key: API Ключ
add_bot: Добавить бота
title: Модуль подключения Telegram к retailCRM
@@ -28,3 +28,13 @@ error_adding_bot: Ошибка при добавлении бота
error_save: Ошибка при сохранении, обратитесь в службу технической поддержки
missing_credentials: "Необходимые методы: {{.Credentials}}"
error_activity_mg: Проверьте активность интеграции с MessageGateway в настройках CRM
+
+sticker: "[стикер]"
+audio: "[аудио файл]"
+contact: "[контакт]"
+document: "[документ]"
+location: "[местонахождение]"
+video: "[видео]"
+voice: "[голосовое сообщение]"
+photo: "[изображение]"
+undefined: "[неопределенный формат сообщения]"