Improve Telegram keyboards and fix admin user menu navigation

Unified inline menus, user callbacks for all users, Home button to exit admin panel.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
tgvpn
2026-05-21 01:40:25 +03:00
parent cbb2133991
commit 23f5e782f8
3 changed files with 228 additions and 119 deletions
+108
View File
@@ -0,0 +1,108 @@
package bot
import (
"fmt"
"telegramvpn/internal/config"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)
const (
cbUserConfig = "user:config"
cbUserHome = "user:home"
cbAdminMenu = "admin:menu"
cbAdminUser = "admin:user"
cbAdminSquads = "admin:squads"
cbAdminCheck = "admin:check"
cbAdminConfig = "admin:config"
)
func trialDays(cfg *config.Config) int {
d := cfg.TrialUserDays
if d <= 0 {
return 1
}
return d
}
func userConfigLabel(cfg *config.Config) string {
return fmt.Sprintf("🔐 Подключить VPN · %d дн.", trialDays(cfg))
}
func userHomeLabel() string {
return "🏠 Главная"
}
func adminPanelLabel() string {
return "🛠 Админ-панель"
}
// userMenuKeyboard — главное меню пользователя (и выход из админки).
func userMenuKeyboard(cfg *config.Config, userID, adminID int64) tgbotapi.InlineKeyboardMarkup {
rows := [][]tgbotapi.InlineKeyboardButton{
tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData(userConfigLabel(cfg), cbUserConfig),
),
}
if userID == adminID {
rows = append(rows, tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData(adminPanelLabel(), cbAdminMenu),
))
}
return tgbotapi.NewInlineKeyboardMarkup(rows...)
}
// configResultKeyboard — после выдачи конфига: ссылка + возврат в меню.
func configResultKeyboard(cfg *config.Config, userID, adminID int64, subscriptionURL string) tgbotapi.InlineKeyboardMarkup {
var rows [][]tgbotapi.InlineKeyboardButton
if subscriptionURL != "" {
rows = append(rows, tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonURL("🔗 Открыть подписку", subscriptionURL),
))
}
rows = append(rows,
tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData(userConfigLabel(cfg), cbUserConfig),
),
tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData(userHomeLabel(), cbUserHome),
),
)
if userID == adminID {
rows = append(rows, tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData(adminPanelLabel(), cbAdminMenu),
))
}
return tgbotapi.NewInlineKeyboardMarkup(rows...)
}
// adminMenuKeyboard — панель администратора.
func adminMenuKeyboard() tgbotapi.InlineKeyboardMarkup {
return tgbotapi.NewInlineKeyboardMarkup(
tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData("👤 Новый пользователь", cbAdminUser),
tgbotapi.NewInlineKeyboardButtonData("📡 Сквады", cbAdminSquads),
),
tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData("🔌 Проверка API", cbAdminCheck),
tgbotapi.NewInlineKeyboardButtonData("⚙️ Настройки", cbAdminConfig),
),
tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonURL("📖 Remnawave Docs", docsURL),
),
tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData(userHomeLabel(), cbUserHome),
),
)
}
// adminContextKeyboard — под ответами админки (проверка, конфиг и т.д.).
func adminContextKeyboard() tgbotapi.InlineKeyboardMarkup {
return tgbotapi.NewInlineKeyboardMarkup(
tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData("🛠 В админ-панель", cbAdminMenu),
tgbotapi.NewInlineKeyboardButtonData(userHomeLabel(), cbUserHome),
),
)
}