информация о пользователе
This commit is contained in:
@@ -7,3 +7,5 @@ class UserOutput(pydantic.BaseModel):
|
||||
id: uuid.UUID
|
||||
telegram_id: int
|
||||
username: str | None
|
||||
first_name: str | None
|
||||
last_name: str | None
|
||||
|
||||
@@ -17,4 +17,6 @@ async def get_me(self: 'Usecase', user_id: uuid.UUID) -> dto.UserOutput:
|
||||
id=user.id,
|
||||
telegram_id=user.telegram_id,
|
||||
username=user.username,
|
||||
first_name=user.first_name,
|
||||
last_name=user.last_name,
|
||||
)
|
||||
|
||||
@@ -68,6 +68,49 @@ func NewBot(
|
||||
return bot
|
||||
}
|
||||
|
||||
// GetOrCreateJWT получает JWT токен, передавая актуальные данные пользователя из update
|
||||
func (b *Bot) GetOrCreateJWT(u *echotron.Update) error {
|
||||
// Извлекаем данные пользователя из update
|
||||
var user *echotron.User
|
||||
if u.Message != nil && u.Message.From != nil {
|
||||
user = u.Message.From
|
||||
} else if u.CallbackQuery != nil && u.CallbackQuery.From != nil {
|
||||
user = u.CallbackQuery.From
|
||||
}
|
||||
|
||||
var username, firstName, lastName *string
|
||||
if user != nil {
|
||||
if user.Username != "" {
|
||||
username = &user.Username
|
||||
}
|
||||
if user.FirstName != "" {
|
||||
firstName = &user.FirstName
|
||||
}
|
||||
if user.LastName != "" {
|
||||
lastName = &user.LastName
|
||||
}
|
||||
}
|
||||
|
||||
// Запрашиваем JWT с актуальными данными пользователя (или создаем нового если не существует)
|
||||
jwt, err := b.Backend.GetJWTByTelegramUser(
|
||||
context.Background(),
|
||||
b.ChatID,
|
||||
username,
|
||||
firstName,
|
||||
lastName,
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Сохраняем в сессию
|
||||
b.Session.JWT = jwt
|
||||
if username != nil {
|
||||
b.Session.UserName = *username
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bot) SetState(s State, mode RenderMode) {
|
||||
log.Info().
|
||||
Int64("chat_id", b.ChatID).
|
||||
@@ -265,6 +308,12 @@ func (b *Bot) Update(u *echotron.Update) {
|
||||
return
|
||||
}
|
||||
|
||||
// Получаем или создаем JWT, обновляя данные пользователя (username, first_name, last_name)
|
||||
if err := b.GetOrCreateJWT(u); err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get or create JWT")
|
||||
// Не блокируем работу бота если JWT не удалось получить - это не критично для всех действий
|
||||
}
|
||||
|
||||
exec := &Exec{}
|
||||
|
||||
b.exec = exec
|
||||
|
||||
@@ -38,8 +38,18 @@ func main() {
|
||||
|
||||
log.Info().Msg("bot starting...")
|
||||
|
||||
updateOpts := echotron.UpdateOptions{
|
||||
AllowedUpdates: []echotron.UpdateType{
|
||||
echotron.MessageUpdate,
|
||||
echotron.CallbackQueryUpdate,
|
||||
echotron.MyChatMemberUpdate,
|
||||
echotron.ChatMemberUpdate,
|
||||
echotron.UpdateType("chat_join_request"),
|
||||
},
|
||||
}
|
||||
|
||||
for {
|
||||
if err := dsp.Poll(); err != nil {
|
||||
if err := dsp.PollOptions(false, updateOpts); err != nil {
|
||||
log.Error().Err(err).Msg("dsp.Poll failed, retrying in 5 seconds...")
|
||||
time.Sleep(5 * time.Second)
|
||||
continue
|
||||
|
||||
@@ -579,14 +579,15 @@ func (s *AddCreative) sendCreativeAndPanel(b *bot.Bot) {
|
||||
}
|
||||
|
||||
func (s *AddCreative) createCreative(b *bot.Bot) {
|
||||
// Получаем JWT
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
// JWT уже создан в Bot.Update(), просто берем из сессии
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start login", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
|
||||
var err error
|
||||
var mediaData []byte
|
||||
if s.MediaFileID != "" {
|
||||
mediaData, err = b.DownloadFileBytes(s.MediaFileID)
|
||||
@@ -685,20 +686,3 @@ https://t.me/+AbCdEfGhIjKlMn</i>`
|
||||
b.SetState(s.BackState, bot.NewMessage)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *AddCreative) 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
|
||||
}
|
||||
|
||||
@@ -28,9 +28,10 @@ type AddPurchase struct {
|
||||
}
|
||||
|
||||
func (s *AddPurchase) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
// JWT уже создан в Bot.Update(), просто берем из сессии
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
@@ -203,20 +204,6 @@ func (s *AddPurchase) renderSelection(b *bot.Bot, mode bot.RenderMode, jwt strin
|
||||
b.Render(text, keyboard, mode)
|
||||
}
|
||||
|
||||
func (s *AddPurchase) ensureJWT(b *bot.Bot) (string, error) {
|
||||
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 *AddPurchase) HandleCallback(b *bot.Bot, u *echotron.Update) {
|
||||
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
|
||||
return
|
||||
|
||||
@@ -24,10 +24,10 @@ type CreativeDetails struct {
|
||||
}
|
||||
|
||||
func (s *CreativeDetails) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
// Получаем JWT
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
// JWT уже создан в Bot.Update(), просто берем из сессии
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
@@ -400,14 +400,16 @@ func (s *CreativeDetails) showManagementPanelWithDelete(b *bot.Bot) {
|
||||
}
|
||||
|
||||
func (s *CreativeDetails) updateCreative(b *bot.Bot) {
|
||||
// Получаем JWT
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
// JWT уже создан в Bot.Update(), просто берем из сессии
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
|
||||
var err error
|
||||
|
||||
// Подготавливаем данные для обновления
|
||||
input := backend.UpdateCreativeInput{
|
||||
Name: s.Name,
|
||||
@@ -471,16 +473,16 @@ func (s *CreativeDetails) updateCreative(b *bot.Bot) {
|
||||
}
|
||||
|
||||
func (s *CreativeDetails) deleteCreative(b *bot.Bot) {
|
||||
// Получаем JWT
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
// JWT уже создан в Bot.Update(), просто берем из сессии
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
|
||||
// Отправляем запрос на удаление
|
||||
err = b.Backend.DeleteCreative(
|
||||
err := b.Backend.DeleteCreative(
|
||||
context.Background(),
|
||||
jwt,
|
||||
s.WorkspaceID,
|
||||
@@ -503,20 +505,3 @@ func (s *CreativeDetails) deleteCreative(b *bot.Bot) {
|
||||
b.SetState(s.BackState, bot.NewMessage)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *CreativeDetails) 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
|
||||
}
|
||||
|
||||
@@ -45,20 +45,18 @@ type CreativeEditorFields struct {
|
||||
}
|
||||
|
||||
const inviteLinkPlaceholder = "{{invite_link}}"
|
||||
const inviteLinkPreviewURL = "https://t.me/placeholder"
|
||||
const inviteLinkPreviewURL = "https://t.me/J7_channel"
|
||||
|
||||
// GetCreativeText возвращает текст для превью креатива
|
||||
func (e *CreativeEditorFields) GetCreativeText() string {
|
||||
var result string
|
||||
|
||||
if e.Text != nil && *e.Text != "" {
|
||||
// Проверяем что текст не является "визуально пустым" HTML
|
||||
// Например: "<a class=\"tg-link\"></a>" - пустая ссылка
|
||||
text := strings.TrimSpace(*e.Text)
|
||||
|
||||
// Убираем пустые HTML-теги (простая проверка)
|
||||
if text == "<a class=\"tg-link\"></a>" || text == "" {
|
||||
log.Info().Str("text", *e.Text).Msg("GetCreativeText: text is visually empty, using default")
|
||||
// Проверяем что текст не пустой
|
||||
if text == "" {
|
||||
log.Info().Str("text", *e.Text).Msg("GetCreativeText: text is empty, using default")
|
||||
return result + `<i>💭 Я твой креатив
|
||||
|
||||
У меня пока нет текста, добавь его ниже.
|
||||
@@ -66,8 +64,14 @@ func (e *CreativeEditorFields) GetCreativeText() string {
|
||||
</i>`
|
||||
}
|
||||
|
||||
// Заменяем пустую ссылку <a class="tg-link"></a> на валидную preview-ссылку
|
||||
text = strings.ReplaceAll(text, `<a class="tg-link"></a>`, `<a href="`+inviteLinkPreviewURL+`">👉 Подписаться</a>`)
|
||||
|
||||
// Также заменяем плейсхолдер {{invite_link}} на preview URL (как в кнопках)
|
||||
text = strings.ReplaceAll(text, inviteLinkPlaceholder, inviteLinkPreviewURL)
|
||||
|
||||
log.Info().Str("text", *e.Text).Msg("GetCreativeText: returning creative text")
|
||||
return result + *e.Text
|
||||
return result + text
|
||||
}
|
||||
log.Info().Bool("text_is_nil", e.Text == nil).Msg("GetCreativeText: returning default text")
|
||||
return result + `<i>💭 Я твой креатив
|
||||
@@ -156,6 +160,9 @@ func (e *CreativeEditorFields) SendCreativePreview(b *bot.Bot) {
|
||||
res, err := b.SendMessage(creativeText, b.ChatID, &echotron.MessageOptions{
|
||||
ReplyMarkup: keyboard,
|
||||
ParseMode: echotron.HTML,
|
||||
LinkPreviewOptions: echotron.LinkPreviewOptions{
|
||||
IsDisabled: true,
|
||||
},
|
||||
})
|
||||
if err == nil && res.Result != nil {
|
||||
msgID = res.Result.ID
|
||||
@@ -169,6 +176,9 @@ func (e *CreativeEditorFields) SendCreativePreview(b *bot.Bot) {
|
||||
res, err := b.SendMessage(creativeText, b.ChatID, &echotron.MessageOptions{
|
||||
ReplyMarkup: keyboard,
|
||||
ParseMode: echotron.HTML,
|
||||
LinkPreviewOptions: echotron.LinkPreviewOptions{
|
||||
IsDisabled: true,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to send creative preview")
|
||||
@@ -258,6 +268,9 @@ func (e *CreativeEditorFields) UpdateCreativePreview(b *bot.Bot) {
|
||||
&echotron.MessageTextOptions{
|
||||
ParseMode: echotron.HTML,
|
||||
ReplyMarkup: keyboard,
|
||||
LinkPreviewOptions: echotron.LinkPreviewOptions{
|
||||
IsDisabled: true,
|
||||
},
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
|
||||
@@ -22,9 +22,10 @@ type Creatives struct {
|
||||
}
|
||||
|
||||
func (s *Creatives) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
// JWT уже создан в Bot.Update(), просто берем из сессии
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start login", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
@@ -131,23 +132,6 @@ func (s *Creatives) renderCreatives(b *bot.Bot, mode bot.RenderMode, jwt string)
|
||||
b.Render(text, keyboard, mode)
|
||||
}
|
||||
|
||||
func (s *Creatives) 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 *Creatives) HandleCallback(b *bot.Bot, u *echotron.Update) {
|
||||
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
|
||||
return
|
||||
|
||||
@@ -12,15 +12,15 @@ import (
|
||||
type Login struct{}
|
||||
|
||||
func (s *Login) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
telegramID := b.ChatID
|
||||
// JWT уже создан в Bot.Update() с актуальными данными пользователя
|
||||
// Теперь создаем login token (это разовый токен для авторизации на сайте)
|
||||
var username *string
|
||||
|
||||
chatInfo, err := b.GetChat(telegramID)
|
||||
if err == nil && chatInfo.Result != nil && chatInfo.Result.Username != "" {
|
||||
username = &chatInfo.Result.Username
|
||||
// Получаем username из сессии если он там сохранен
|
||||
if b.Session.UserName != "" {
|
||||
username = &b.Session.UserName
|
||||
}
|
||||
|
||||
token, err := b.Backend.CreateLoginToken(context.Background(), telegramID, username)
|
||||
token, err := b.Backend.CreateLoginToken(context.Background(), b.ChatID, username)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to create login token")
|
||||
b.SendMessage("❌ Произошла ошибка при создании токена входа. Попробуйте позже.", b.ChatID, nil)
|
||||
|
||||
@@ -20,10 +20,10 @@ type MyPlacements struct {
|
||||
}
|
||||
|
||||
func (s *MyPlacements) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
// Получаем или запрашиваем JWT
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
// JWT уже создан в Bot.Update(), просто берем из сессии
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start login", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
@@ -124,23 +124,6 @@ func (s *MyPlacements) renderPlacements(b *bot.Bot, mode bot.RenderMode, jwt str
|
||||
b.Render(text, keyboard, mode)
|
||||
}
|
||||
|
||||
func (s *MyPlacements) 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 *MyPlacements) HandleCallback(b *bot.Bot, u *echotron.Update) {
|
||||
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
|
||||
return
|
||||
|
||||
@@ -21,10 +21,10 @@ type MyProjects struct {
|
||||
}
|
||||
|
||||
func (s *MyProjects) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
// Получаем или запрашиваем JWT
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
// JWT уже создан в Bot.Update(), просто берем из сессии
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start login", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
@@ -167,23 +167,6 @@ func (s *MyProjects) renderProjects(b *bot.Bot, mode bot.RenderMode, jwt string)
|
||||
b.Render(text, keyboard, mode)
|
||||
}
|
||||
|
||||
func (s *MyProjects) 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 *MyProjects) HandleCallback(b *bot.Bot, u *echotron.Update) {
|
||||
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
|
||||
return
|
||||
|
||||
@@ -18,9 +18,9 @@ type PurchaseDetails struct {
|
||||
}
|
||||
|
||||
func (s *PurchaseDetails) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
@@ -136,20 +136,6 @@ func (s *PurchaseDetails) renderDetails(b *bot.Bot, mode bot.RenderMode, jwt str
|
||||
b.Render(text, keyboard, mode)
|
||||
}
|
||||
|
||||
func (s *PurchaseDetails) ensureJWT(b *bot.Bot) (string, error) {
|
||||
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 *PurchaseDetails) HandleCallback(b *bot.Bot, u *echotron.Update) {
|
||||
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
|
||||
return
|
||||
|
||||
@@ -207,9 +207,9 @@ func (s *PurchaseOptionalDetails) HandleCallback(b *bot.Bot, u *echotron.Update)
|
||||
BackState: s.BackState,
|
||||
}, bot.EditMessage)
|
||||
case "next":
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
@@ -285,20 +285,6 @@ func (s *PurchaseOptionalDetails) HandleMessage(b *bot.Bot, u *echotron.Update)
|
||||
|
||||
func (s *PurchaseOptionalDetails) Handle(_ *bot.Bot, _ *echotron.Update) { return }
|
||||
|
||||
func (s *PurchaseOptionalDetails) ensureJWT(b *bot.Bot) (string, error) {
|
||||
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 *PurchaseOptionalDetails) SetDateTimeSelection(key string, value time.Time) {
|
||||
switch key {
|
||||
case "placement_datetime":
|
||||
|
||||
@@ -17,9 +17,9 @@ type Purchases struct {
|
||||
}
|
||||
|
||||
func (s *Purchases) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
jwt, err := s.ensureJWT(b)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to get JWT")
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
@@ -109,20 +109,6 @@ func (s *Purchases) renderPurchases(b *bot.Bot, mode bot.RenderMode, jwt string)
|
||||
b.Render(text, keyboard, mode)
|
||||
}
|
||||
|
||||
func (s *Purchases) ensureJWT(b *bot.Bot) (string, error) {
|
||||
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 *Purchases) HandleCallback(b *bot.Bot, u *echotron.Update) {
|
||||
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
|
||||
return
|
||||
|
||||
@@ -130,20 +130,6 @@ func (s *SelectChannelsForPurchase) renderChannelSelection(b *bot.Bot, mode bot.
|
||||
b.Render(text, keyboard, mode)
|
||||
}
|
||||
|
||||
func (s *SelectChannelsForPurchase) ensureJWT(b *bot.Bot) (string, error) {
|
||||
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 *SelectChannelsForPurchase) HandleCallback(b *bot.Bot, u *echotron.Update) {
|
||||
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
|
||||
return
|
||||
|
||||
@@ -16,9 +16,10 @@ type SelectWorkspace struct {
|
||||
}
|
||||
|
||||
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")
|
||||
// JWT уже создан в Bot.Update(), просто берем из сессии
|
||||
jwt := b.Session.JWT
|
||||
if jwt == "" {
|
||||
log.Error().Msg("JWT is empty in session")
|
||||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
|
||||
return
|
||||
}
|
||||
@@ -56,23 +57,6 @@ func (s *SelectWorkspace) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user