Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions internal/bot/payment.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,11 @@ func (b *Bot) paymentActivatedMessage(telegramID int64) string {
}

func (h *paymentCallbackHandler) finalizeActivatedPayment(payment *database.Payment, notifyUser bool) {
// Сбрасываем состояние только если пользователь всё ещё в платёжном flow
h.bot.userStates.DeleteIfOneOf(payment.TelegramID, StateWaitPaymentMethod, StateWaitPaymentResult)

if notifyUser {
_ = h.bot.sendSchedulerMessage(payment.TelegramID, h.bot.paymentActivatedMessage(payment.TelegramID))
_ = h.bot.sendSchedulerMessageWithKeyboard(payment.TelegramID, h.bot.paymentActivatedMessage(payment.TelegramID), h.bot.userKeyboard(payment.TelegramID))
}

// Очищаем уведомления (пользователь мог быть в grace period)
Expand Down Expand Up @@ -396,7 +399,8 @@ func (h *paymentCallbackHandler) handleCanceled(payment *database.Payment) error
if err := h.bot.db.UpdatePaymentStatus(payment.ID, "canceled"); err != nil {
return fmt.Errorf("update status to canceled: %w", err)
}
_ = h.bot.sendSchedulerMessage(payment.TelegramID, "❌ Платёж отменён. Вы можете попробовать снова.")
h.bot.userStates.DeleteIfOneOf(payment.TelegramID, StateWaitPaymentMethod, StateWaitPaymentResult)
_ = h.bot.sendSchedulerMessageWithKeyboard(payment.TelegramID, "❌ Платёж отменён. Вы можете попробовать снова.", h.bot.userKeyboard(payment.TelegramID))
return nil
}

Expand Down
12 changes: 12 additions & 0 deletions internal/bot/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,18 @@ func (b *Bot) sendSchedulerMessage(telegramID int64, message string) error {
return err
}

// sendSchedulerMessageWithKeyboard отправляет сообщение с клавиатурой (для замены текущих кнопок)
func (b *Bot) sendSchedulerMessageWithKeyboard(telegramID int64, message string, markup *tele.ReplyMarkup) error {
if b.bot == nil {
return fmt.Errorf("telegram bot is not initialized")
}
_, err := b.bot.Send(&tele.User{ID: telegramID}, message, &tele.SendOptions{
ParseMode: tele.ModeHTML,
ReplyMarkup: markup,
})
return err
}

// isSchedulerForbiddenError проверяет, заблокировал ли пользователь бот или деактивирован.
func isSchedulerForbiddenError(err error) bool {
return errors.Is(err, tele.ErrBlockedByUser) ||
Expand Down
13 changes: 13 additions & 0 deletions internal/bot/state_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,16 @@ func (sm *stateMap) Delete(telegramID int64) {
defer sm.mu.Unlock()
delete(sm.m, telegramID)
}

// DeleteIfOneOf удаляет состояние только если оно совпадает с одним из переданных
func (sm *stateMap) DeleteIfOneOf(telegramID int64, states ...string) {
sm.mu.Lock()
defer sm.mu.Unlock()
cur := sm.m[telegramID]
for _, s := range states {
if cur == s {
delete(sm.m, telegramID)
return
}
}
}
Loading