new telegram bot
This commit is contained in:
149
telegram_bot/screens/select_workspace.go
Normal file
149
telegram_bot/screens/select_workspace.go
Normal file
@@ -0,0 +1,149 @@
|
||||
package screens
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"example.com/m/bot"
|
||||
"github.com/NicoNex/echotron/v3"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
type SelectWorkspace struct {
|
||||
ChannelID string
|
||||
BackState bot.State
|
||||
}
|
||||
|
||||
func (s *SelectWorkspace) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
|
||||
workspaces, err := b.Backend.GetWorkspaces(context.Background(), jwt)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get workspaces")
|
||||
b.SendNew("❌ Не удалось загрузить список workspace'ов", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
|
||||
if len(workspaces) == 0 {
|
||||
b.SendNew("У вас пока нет workspace'ов", bot.Keyboard(
|
||||
bot.Row(bot.Button("🏠 Главное меню", "back")),
|
||||
))
|
||||
return
|
||||
}
|
||||
|
||||
text := "📁 Выбор workspace для канала\n\n"
|
||||
text += "В какой workspace добавить канал?"
|
||||
|
||||
var buttons [][]echotron.InlineKeyboardButton
|
||||
|
||||
// Создаем кнопки для каждого workspace
|
||||
for _, ws := range workspaces {
|
||||
buttons = append(buttons, bot.Row(
|
||||
bot.Button(ws.Name, fmt.Sprintf("select_workspace:%s", ws.ID)),
|
||||
))
|
||||
}
|
||||
|
||||
// Кнопка отмены
|
||||
buttons = append(buttons, bot.Row(bot.Button("❌ Отмена", "cancel")))
|
||||
|
||||
keyboard := bot.Keyboard(buttons...)
|
||||
b.Render(text, keyboard, mode)
|
||||
}
|
||||
|
||||
func (s *SelectWorkspace) ensureJWT(b *bot.Bot) (string, error) {
|
||||
// Проверяем, есть ли JWT в сессии
|
||||
if b.Session.JWT != "" {
|
||||
return b.Session.JWT, nil
|
||||
}
|
||||
|
||||
// Если нет, запрашиваем новый
|
||||
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Сохраняем в сессию
|
||||
b.Session.JWT = jwt
|
||||
return jwt, nil
|
||||
}
|
||||
|
||||
func (s *SelectWorkspace) HandleCallback(b *bot.Bot, u *echotron.Update) {
|
||||
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
|
||||
return
|
||||
}
|
||||
|
||||
data := u.CallbackQuery.Data
|
||||
|
||||
switch {
|
||||
case data == "cancel", data == "back":
|
||||
if s.BackState != nil {
|
||||
b.SetState(s.BackState, bot.NewMessage)
|
||||
}
|
||||
|
||||
case strings.HasPrefix(data, "select_workspace:"):
|
||||
// Извлекаем workspace_id
|
||||
parts := strings.Split(data, ":")
|
||||
if len(parts) != 2 {
|
||||
log.Error().Str("callback_data", data).Msg("Invalid callback data format")
|
||||
return
|
||||
}
|
||||
|
||||
workspaceID := parts[1]
|
||||
|
||||
// Показываем индикатор загрузки
|
||||
b.Edit("⏳ Добавляем канал в workspace...", bot.Keyboard())
|
||||
|
||||
// Вызываем API для привязки канала к workspace
|
||||
project, err := b.Backend.AttachChannelToWorkspace(
|
||||
context.Background(),
|
||||
s.ChannelID,
|
||||
workspaceID,
|
||||
b.ChatID,
|
||||
)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("channel_id", s.ChannelID).Str("workspace_id", workspaceID).Msg("Failed to attach channel to workspace")
|
||||
b.Edit("❌ Не удалось добавить канал в workspace", bot.Keyboard(
|
||||
bot.Row(bot.Button("« Назад", "back_to_select")),
|
||||
))
|
||||
return
|
||||
}
|
||||
|
||||
// Показываем успешное сообщение
|
||||
successText := fmt.Sprintf("✅ Канал успешно добавлен!\n\n"+
|
||||
"📊 Проект ID: %s\n"+
|
||||
"📝 Название: %s\n"+
|
||||
"🏷 Статус: %s",
|
||||
project.ID,
|
||||
project.Title,
|
||||
project.Status,
|
||||
)
|
||||
|
||||
b.Edit(successText, bot.Keyboard(
|
||||
bot.Row(bot.Button("📋 Мои проекты", "my_projects")),
|
||||
bot.Row(bot.Button("🏠 Главное меню", "main_menu")),
|
||||
))
|
||||
|
||||
case data == "back_to_select":
|
||||
s.Enter(b, bot.EditMessage)
|
||||
|
||||
case data == "my_projects":
|
||||
b.SetState(&MyProjects{}, bot.NewMessage)
|
||||
|
||||
case data == "main_menu":
|
||||
b.SetState(&MainMenu{}, bot.NewMessage)
|
||||
|
||||
default:
|
||||
s.Enter(b, bot.NewMessage)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (s *SelectWorkspace) HandleMessage(_ *bot.Bot, _ *echotron.Update) { return }
|
||||
|
||||
func (s *SelectWorkspace) Handle(_ *bot.Bot, _ *echotron.Update) { return }
|
||||
Reference in New Issue
Block a user