template
This commit is contained in:
50
pkg/bot/bot.go
Normal file
50
pkg/bot/bot.go
Normal file
@ -0,0 +1,50 @@
|
||||
package bot
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"git/ecom/jira-bot/pkg/bot/middlewares"
|
||||
"git/ecom/jira-bot/pkg/bot/scenes"
|
||||
"git/ecom/jira-bot/pkg/config"
|
||||
"git/ecom/jira-bot/pkg/templates"
|
||||
"git/ecom/jira-bot/pkg/utils"
|
||||
|
||||
"log"
|
||||
|
||||
telegram "gopkg.in/tucnak/telebot.v2"
|
||||
)
|
||||
|
||||
// Чатбот
|
||||
func JiraBot() {
|
||||
|
||||
cfg, _ := config.GetConfig()
|
||||
redis := utils.Redis(cfg.Redis)
|
||||
ctx := context.Background()
|
||||
jiraClient, _ := utils.GetClient(&cfg.Jira)
|
||||
b, err := telegram.NewBot(telegram.Settings{
|
||||
URL: cfg.Telegram.Url,
|
||||
Token: cfg.Telegram.Token,
|
||||
Poller: middlewares.RedisSession(redis, ctx),
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
}
|
||||
|
||||
b.Handle(telegram.OnText, func(m *telegram.Message) {
|
||||
// spew.Dump(m)
|
||||
b.Send(m.Sender, m.Text)
|
||||
})
|
||||
|
||||
// Cтартовая сцена
|
||||
b.Handle("/start", scenes.Start(b, cfg))
|
||||
|
||||
b.Handle("/exit", scenes.Exit(b, redis, ctx))
|
||||
b.Handle("/hello", func(m *telegram.Message) {
|
||||
b.Send(m.Sender, "Hello World!")
|
||||
})
|
||||
|
||||
fmt.Println(templates.Title(b.Me, cfg.BotVersion,jiraClient.GetBaseURL().Host))
|
||||
b.Start()
|
||||
}
|
49
pkg/bot/middlewares/session.go
Normal file
49
pkg/bot/middlewares/session.go
Normal file
@ -0,0 +1,49 @@
|
||||
package middlewares
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"git/ecom/jira-bot/pkg/utils"
|
||||
"log"
|
||||
"strconv"
|
||||
|
||||
"github.com/fatih/color"
|
||||
"github.com/go-redis/redis/v8"
|
||||
telegram "gopkg.in/tucnak/telebot.v2"
|
||||
)
|
||||
|
||||
func RedisSession(redis *redis.Client, ctx context.Context) *telegram.MiddlewarePoller {
|
||||
poller := utils.NewPooler(10)
|
||||
session := telegram.NewMiddlewarePoller(poller, func(upd *telegram.Update) bool {
|
||||
userid := strconv.Itoa(upd.Message.Sender.ID) + ":" + strconv.Itoa(int(upd.Message.Chat.ID))
|
||||
log.Println(userid, upd.Message.Chat.FirstName, ":", upd.Message.Text)
|
||||
exist, err := redis.HExists(ctx, "users", userid).Result()
|
||||
if err != nil {
|
||||
log.Println("Ошибка проверки пользователя", err.Error())
|
||||
}
|
||||
if exist {
|
||||
return true
|
||||
}
|
||||
|
||||
color.Green("Новый пользователь!")
|
||||
user, err := json.Marshal(utils.User{
|
||||
Id: upd.Message.Sender.ID,
|
||||
Role: utils.Client,
|
||||
Username: upd.Message.Sender.Username,
|
||||
Name: upd.Message.Sender.FirstName + " " + upd.Message.Sender.LastName,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
log.Println("Ошибка Marshal:", err.Error())
|
||||
}
|
||||
|
||||
err = redis.HSet(ctx, "users", userid, user).Err()
|
||||
|
||||
if err != nil {
|
||||
log.Println("Ошибка:", err.Error())
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
return session
|
||||
}
|
27
pkg/bot/scenes/exit.go
Normal file
27
pkg/bot/scenes/exit.go
Normal file
@ -0,0 +1,27 @@
|
||||
package scenes
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"strconv"
|
||||
|
||||
"github.com/go-redis/redis/v8"
|
||||
telegram "gopkg.in/tucnak/telebot.v2"
|
||||
)
|
||||
|
||||
/*
|
||||
Выход из чат бота
|
||||
|
||||
Удаляем сессию и прощаемся
|
||||
*/
|
||||
func Exit(b *telegram.Bot, redis *redis.Client, ctx context.Context) interface{} {
|
||||
return func(m *telegram.Message) {
|
||||
userid := strconv.Itoa(m.Sender.ID) + ":" + strconv.Itoa(int(m.Chat.ID))
|
||||
|
||||
err := redis.HDel(ctx, "users", userid).Err()
|
||||
if err != nil {
|
||||
log.Println("Ошибка удаления пользователя", err.Error())
|
||||
}
|
||||
b.Send(m.Sender, "Пока!")
|
||||
}
|
||||
}
|
65
pkg/bot/scenes/start.go
Normal file
65
pkg/bot/scenes/start.go
Normal file
@ -0,0 +1,65 @@
|
||||
package scenes
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"git/ecom/jira-bot/pkg/config"
|
||||
"git/ecom/jira-bot/pkg/templates"
|
||||
"git/ecom/jira-bot/pkg/utils"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
telegram "gopkg.in/tucnak/telebot.v2"
|
||||
)
|
||||
|
||||
/*
|
||||
Cтартовая команда
|
||||
|
||||
Пытаемся достать авторизацию из magic link или base64 токена
|
||||
Если ничего не нашли то приветствуем пользователя и предлагаем залогинится в чат боте
|
||||
*/
|
||||
func Start(b *telegram.Bot, cfg *config.Config) interface{} {
|
||||
return func(m *telegram.Message) {
|
||||
// Eсли что то есть в payload
|
||||
if len(m.Payload) > 0 {
|
||||
|
||||
decoded, err := base64.StdEncoding.DecodeString(m.Payload)
|
||||
if err != nil {
|
||||
log.Println("decode error:", err)
|
||||
b.Send(m.Sender, "Ошибка декодирования токена")
|
||||
return
|
||||
}
|
||||
tokenData := strings.Split(string(decoded), ":")
|
||||
cfg.Jira.Auth.Username, cfg.Jira.Auth.Password = tokenData[0], tokenData[1]
|
||||
|
||||
client, err := utils.GetClient(&cfg.Jira)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
b.Send(m.Sender, "Ошибка авторизации в jira")
|
||||
// Отправить template
|
||||
return
|
||||
}
|
||||
|
||||
usr, userRes, err := client.User.GetSelf()
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
spew.Dump(userRes)
|
||||
b.Send(m.Sender, "Ошибка получении пользовательских данных")
|
||||
// Отправить template
|
||||
return
|
||||
}
|
||||
|
||||
sendRes, err := b.Send(m.Sender, templates.Hello(usr.DisplayName), telegram.ModeMarkdown)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
spew.Dump(sendRes)
|
||||
b.Send(m.Sender, "Ошибка отправки сообщения")
|
||||
// Cделать отправку себе
|
||||
b.Send(m.Sender, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
// Если ничего не нашли приветствуем пользователя
|
||||
b.Send(m.Sender, "Hello World!")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user