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